diff --git a/demo/app/main-page.xml b/demo/app/main-page.xml
index 78feed4..356493b 100644
--- a/demo/app/main-page.xml
+++ b/demo/app/main-page.xml
@@ -7,10 +7,13 @@
+
+
+
diff --git a/demo/app/main-view-model.ts b/demo/app/main-view-model.ts
index 49228c5..1aaf0c9 100644
--- a/demo/app/main-view-model.ts
+++ b/demo/app/main-view-model.ts
@@ -6,17 +6,25 @@ import { prompt } from "tns-core-modules/ui/dialogs";
/************ SET THESE FOR QUICK LOGIN ************/
const PARTICLE_USERNAME = undefined;
const PARTICLE_PASSWORD = undefined;
+/************ ALT LOGIN WITH TOKEN ************/
+const PARTICLE_TOKEN = undefined;
+/************ SET PARTICLE EVENT NAME ************/
+const PARTICLE_EVENT_NAME = undefined;
/***************************************************/
export class HelloWorldModel extends Observable {
private static MESSAGE_KEY = "message";
private static LOGGED_IN_KEY = "loggedIn";
private static SELECTED_DEVICE_KEY = "selectedDevice";
+ private static SUBSCRIBE_BUTTON_KEY = "subButtonText";
loggedIn: boolean = false;
message: string = "Log in to get started";
devices: ObservableArray = new ObservableArray();
selectedDevice: TNSParticleDevice;
+ handleEvents: boolean = false;
+ subscribed: boolean = false;
+ subButtonText: string = "Subscribe to Events";
private particle: Particle;
@@ -24,11 +32,16 @@ export class HelloWorldModel extends Observable {
super();
this.particle = new Particle();
+ if (PARTICLE_EVENT_NAME) this.handleEvents = true;
}
login(): void {
if (PARTICLE_USERNAME && PARTICLE_PASSWORD) {
this.doLogin(PARTICLE_USERNAME, PARTICLE_PASSWORD);
+ } else if (PARTICLE_TOKEN){
+ console.log('login tap, go for loginwithtoken option');
+
+ this.doLoginWithToken(PARTICLE_TOKEN);
} else {
prompt({
title: "Particle username",
@@ -58,6 +71,12 @@ export class HelloWorldModel extends Observable {
.catch(error => this.set(HelloWorldModel.MESSAGE_KEY, error));
}
+ private doLoginWithToken(token: string): void {
+ this.particle.loginWithToken(PARTICLE_TOKEN);
+ this.set(HelloWorldModel.LOGGED_IN_KEY, true);
+ this.set(HelloWorldModel.MESSAGE_KEY, "Logged in");
+ }
+
logout(): void {
this.particle.logout();
this.devices.splice(0, this.devices.length);
@@ -113,4 +132,24 @@ export class HelloWorldModel extends Observable {
.then(result => this.set(HelloWorldModel.MESSAGE_KEY, `${vari.name} result: ${result}`))
.catch(error => this.set(HelloWorldModel.MESSAGE_KEY, error));
}
+
+ onDeviceSubscribe(args): void {
+ this.subscribed = !this.subscribed;
+ this.set(HelloWorldModel.SUBSCRIBE_BUTTON_KEY, this.subscribed ? "Unsubscribe" : "Subscribe to Events");
+ if (this.subscribed) {
+ this.selectedDevice.subscribe(PARTICLE_EVENT_NAME, (data) => {
+ console.log(`selectedDevice.subscribe activity, eventdata: ${data}`);
+ });
+ } else {
+ this.selectedDevice.unsubscribe();
+ }
+ }
+
+ startwizard(): void {
+ console.log('start wizard tapped');
+ this.particle.startDeviceSetupWizard((result) => {
+ console.log('wizard callback');
+ });
+
+ }
}
diff --git a/demo/tsconfig.json b/demo/tsconfig.json
index 4b787a4..e5a86c7 100644
--- a/demo/tsconfig.json
+++ b/demo/tsconfig.json
@@ -1,44 +1,43 @@
{
- "compilerOptions": {
- "target": "es5",
- "module": "commonjs",
- "declaration": false,
- "removeComments": true,
- "noLib": false,
- "emitDecoratorMetadata": true,
- "experimentalDecorators": true,
- "lib": [
- "es6",
- "dom"
+ "compilerOptions": {
+ "target": "es5",
+ "module": "commonjs",
+ "declaration": false,
+ "removeComments": true,
+ "noLib": false,
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "lib": [
+ "es6",
+ "dom"
+ ],
+ "pretty": true,
+ "allowUnreachableCode": false,
+ "allowUnusedLabels": false,
+ "noEmitHelpers": true,
+ "noEmitOnError": false,
+ "noImplicitAny": false,
+ "noImplicitReturns": true,
+ "noImplicitUseStrict": false,
+ "noFallthroughCasesInSwitch": true,
+ "baseUrl": ".",
+ "paths": {
+ "*": [
+ "./node_modules/*"
+ ],
+ "~/*": [
+ "app/*"
+ ]
+ }
+ },
+ "include": [
+ "../src",
+ "**/*"
],
- "sourceMap": false,
- "pretty": true,
- "allowUnreachableCode": false,
- "allowUnusedLabels": false,
- "noEmitHelpers": true,
- "noEmitOnError": false,
- "noImplicitAny": false,
- "noImplicitReturns": true,
- "noImplicitUseStrict": false,
- "noFallthroughCasesInSwitch": true,
- "baseUrl": ".",
- "paths": {
- "*": [
- "./node_modules/*"
- ],
- "~/*": [
- "app/*"
- ]
- }
- },
- "include": [
- "../src",
- "**/*"
- ],
- "exclude": [
- "../src/node_modules",
- "node_modules",
- "platforms"
- ],
- "compileOnSave": false
-}
+ "exclude": [
+ "../src/node_modules",
+ "node_modules",
+ "platforms"
+ ],
+ "compileOnSave": false
+}
\ No newline at end of file
diff --git a/publish/package-lock.json b/publish/package-lock.json
index 2b897ec..8431a8c 100644
--- a/publish/package-lock.json
+++ b/publish/package-lock.json
@@ -16,7 +16,7 @@
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
- "balanced-match": "1.0.0",
+ "balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
@@ -38,12 +38,12 @@
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true,
"requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
},
"inflight": {
@@ -52,8 +52,8 @@
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
"inherits": {
@@ -68,7 +68,7 @@
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
- "brace-expansion": "1.1.11"
+ "brace-expansion": "^1.1.7"
}
},
"ncp": {
@@ -83,7 +83,7 @@
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
- "wrappy": "1.0.2"
+ "wrappy": "1"
}
},
"path-is-absolute": {
@@ -98,7 +98,7 @@
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
"requires": {
- "glob": "7.1.2"
+ "glob": "^7.0.5"
}
},
"wrappy": {
diff --git a/src/package-lock.json b/src/package-lock.json
index 74c88f4..6448767 100644
--- a/src/package-lock.json
+++ b/src/package-lock.json
@@ -1,528 +1,528 @@
{
- "name": "nativescript-particle",
- "version": "1.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
+ "name": "nativescript-particle",
+ "version": "1.1.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "async": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
+ "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
"ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "1.0.3"
- }
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
},
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz",
+ "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.18.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz",
+ "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "deep-equal": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz",
+ "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "i": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
+ "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "ncp": {
+ "version": "1.0.1",
+ "resolved": "http://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz",
+ "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "pkginfo": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
+ "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=",
+ "dev": true
+ },
+ "prompt": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz",
+ "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=",
+ "dev": true,
+ "requires": {
+ "colors": "^1.1.2",
+ "pkginfo": "0.x.x",
+ "read": "1.0.x",
+ "revalidator": "0.1.x",
+ "utile": "0.3.x",
+ "winston": "2.1.x"
+ }
+ },
+ "read": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+ "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
+ "dev": true,
+ "requires": {
+ "mute-stream": "~0.0.4"
+ }
+ },
+ "resolve": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
+ "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.5"
+ }
+ },
+ "revalidator": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz",
+ "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.0.5"
+ }
+ },
+ "semver": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+ "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "tns-core-modules": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/tns-core-modules/-/tns-core-modules-4.2.1.tgz",
+ "integrity": "sha512-UH38lmVrdEJatc8l2q0p7WxWRhv6dXvkwY67cenSRl0FC4z7W/dih3fSlKp4yM9Uo0vu2RFsKRa9+UHyZR1YQA==",
+ "dev": true,
+ "requires": {
+ "tns-core-modules-widgets": "4.2.1"
+ }
+ },
+ "tns-core-modules-widgets": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/tns-core-modules-widgets/-/tns-core-modules-widgets-4.2.1.tgz",
+ "integrity": "sha512-ncy7D1oxuuX78sZL+MImxEZBYOUnxma7ZIkAsGRdyPjb7a/A/MoaIXmDLK+Ib2xw4Ul2qlCD1nvF56Q1Dy1m4Q==",
+ "dev": true
+ },
+ "tns-platform-declarations": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/tns-platform-declarations/-/tns-platform-declarations-4.2.1.tgz",
+ "integrity": "sha512-v8HRkYQ24R/MoVPPb5swcGytICKgl8rdoC805yBAWZ7CoROUSFo9M+sfZXix9mvrrHXBFzJDy8kdGjaQ40gBoA==",
+ "dev": true
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tslint": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz",
+ "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.22.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.7.0",
+ "minimatch": "^3.0.4",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.27.2"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "typescript": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.4.tgz",
+ "integrity": "sha512-IIU5cN1mR5J3z9jjdESJbnxikTrEz3lzAw/D0Tf45jHpBp55nY31UkUvmVHoffCfKHTqJs3fCLPDxknQTTFegQ==",
+ "dev": true
+ },
+ "utile": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz",
+ "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=",
+ "dev": true,
+ "requires": {
+ "async": "~0.9.0",
+ "deep-equal": "~0.2.1",
+ "i": "0.3.x",
+ "mkdirp": "0.x.x",
+ "ncp": "1.0.x",
+ "rimraf": "2.x.x"
+ }
+ },
+ "winston": {
+ "version": "2.1.1",
+ "resolved": "http://registry.npmjs.org/winston/-/winston-2.1.1.tgz",
+ "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=",
+ "dev": true,
+ "requires": {
+ "async": "~1.0.0",
+ "colors": "1.0.x",
+ "cycle": "1.0.x",
+ "eyes": "0.1.x",
+ "isstream": "0.1.x",
+ "pkginfo": "0.3.x",
+ "stack-trace": "0.0.x"
+ },
+ "dependencies": {
"async": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
- "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
- "dev": true
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "dev": true,
- "requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.2",
- "js-tokens": "3.0.2"
- },
- "dependencies": {
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- }
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
- "dev": true
- },
- "chalk": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.5.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "1.9.2"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "3.0.0"
- }
- }
- }
- },
- "color-convert": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
- "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.1"
- }
- },
- "color-name": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
- "dev": true
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
},
"colors": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.1.tgz",
- "integrity": "sha512-jg/vxRmv430jixZrC+La5kMbUWqIg32/JsYNZb94+JEmzceYbWKTsv1OuTp+7EaqiaWRR2tPcykibwCRgclIsw==",
- "dev": true
- },
- "commander": {
- "version": "2.16.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz",
- "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "cycle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
- "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
- "dev": true
- },
- "deep-equal": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz",
- "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=",
- "dev": true
- },
- "diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
- },
- "eyes": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
- "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "dev": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "i": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
- "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
- "dev": true
- },
- "js-yaml": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
- "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
- "dev": true,
- "requires": {
- "argparse": "1.0.10",
- "esprima": "4.0.1"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "dev": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
- "dev": true
- },
- "ncp": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz",
- "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=",
- "dev": true
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
},
"pkginfo": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
- "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=",
- "dev": true
- },
- "prompt": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz",
- "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=",
- "dev": true,
- "requires": {
- "colors": "1.3.1",
- "pkginfo": "0.4.1",
- "read": "1.0.7",
- "revalidator": "0.1.8",
- "utile": "0.3.0",
- "winston": "2.1.1"
- }
- },
- "read": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
- "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
- "dev": true,
- "requires": {
- "mute-stream": "0.0.7"
- }
- },
- "resolve": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
- "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
- "dev": true,
- "requires": {
- "path-parse": "1.0.6"
- }
- },
- "revalidator": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz",
- "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=",
- "dev": true
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "dev": true,
- "requires": {
- "glob": "7.1.2"
- }
- },
- "semver": {
- "version": "5.5.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
- "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
- "dev": true
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
- "dev": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- },
- "tns-core-modules": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/tns-core-modules/-/tns-core-modules-4.2.0.tgz",
- "integrity": "sha512-tEbQfeXVp6i9RJAmC+erd63mr6NYw5nX/gzYDVb1Va52/Jdj9ZeGbXKAPyjVXZ3BGI6O9QM1jQUem/Ow6v5FqQ==",
- "dev": true,
- "requires": {
- "tns-core-modules-widgets": "4.2.0"
- }
- },
- "tns-core-modules-widgets": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/tns-core-modules-widgets/-/tns-core-modules-widgets-4.2.0.tgz",
- "integrity": "sha512-0YlfWN1Wy2qFlnzwrwit910whA9TC9en1PxS/5Yx63lL9uXHyOB53C8POnKfM82YUFVPxifcpuYtCC7+DBXbag==",
- "dev": true
- },
- "tns-platform-declarations": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/tns-platform-declarations/-/tns-platform-declarations-4.2.0.tgz",
- "integrity": "sha512-XY31UJiLzmQsYx4fdbG6yUIoEO/p5y3ApYvIYQlSzuXDaekKk96dfBPXNe9P3JNfZZSybQttK7Vqv9w9yTjdkA==",
- "dev": true
- },
- "tslib": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
- "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
- "dev": true
- },
- "tslint": {
- "version": "5.11.0",
- "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz",
- "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=",
- "dev": true,
- "requires": {
- "babel-code-frame": "6.26.0",
- "builtin-modules": "1.1.1",
- "chalk": "2.4.1",
- "commander": "2.16.0",
- "diff": "3.5.0",
- "glob": "7.1.2",
- "js-yaml": "3.12.0",
- "minimatch": "3.0.4",
- "resolve": "1.8.1",
- "semver": "5.5.1",
- "tslib": "1.9.3",
- "tsutils": "2.29.0"
- }
- },
- "tsutils": {
- "version": "2.29.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
- "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
- "dev": true,
- "requires": {
- "tslib": "1.9.3"
- }
- },
- "typescript": {
- "version": "2.8.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.4.tgz",
- "integrity": "sha512-IIU5cN1mR5J3z9jjdESJbnxikTrEz3lzAw/D0Tf45jHpBp55nY31UkUvmVHoffCfKHTqJs3fCLPDxknQTTFegQ==",
- "dev": true
- },
- "utile": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz",
- "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=",
- "dev": true,
- "requires": {
- "async": "0.9.2",
- "deep-equal": "0.2.2",
- "i": "0.3.6",
- "mkdirp": "0.5.1",
- "ncp": "1.0.1",
- "rimraf": "2.6.2"
- }
- },
- "winston": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz",
- "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=",
- "dev": true,
- "requires": {
- "async": "1.0.0",
- "colors": "1.0.3",
- "cycle": "1.0.3",
- "eyes": "0.1.8",
- "isstream": "0.1.2",
- "pkginfo": "0.3.1",
- "stack-trace": "0.0.10"
- },
- "dependencies": {
- "async": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
- "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
- "dev": true
- },
- "colors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
- "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
- "dev": true
- },
- "pkginfo": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
- "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=",
- "dev": true
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
+ "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=",
+ "dev": true
}
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
}
+ }
}
diff --git a/src/package.json b/src/package.json
index 1d4cf7a..600d91c 100644
--- a/src/package.json
+++ b/src/package.json
@@ -1,6 +1,6 @@
{
"name": "nativescript-particle",
- "version": "1.0.1",
+ "version": "1.1.0",
"description": "Control your Particle.io devices from a NativeScript app!",
"main": "particle",
"typings": "index.d.ts",
diff --git a/src/particle-event-worker.ts b/src/particle-event-worker.ts
new file mode 100644
index 0000000..ef14c5e
--- /dev/null
+++ b/src/particle-event-worker.ts
@@ -0,0 +1,196 @@
+require("globals"); // necessary to bootstrap tns modules on the new thread
+import {
+ TNSParticleDevice,
+ TNSParticleDeviceVariable,
+ getDeviceType,
+ TNSParticleLoginOptions,
+ TNSParticleDeviceType
+} from "./particle.common";
+
+// declare const io: any;
+const ParticleCloudSDK = io.particle.android.sdk.cloud.ParticleCloudSDK;
+declare module io {
+ export module particle {
+ export module android {
+ export module sdk {
+ export module cloud {
+ export class ParticleCloudSDK {
+ public static class: java.lang.Class;
+ public static getCloud(): any;
+ // public static initWithOauthCredentialsProvider(param0: globalAndroid.content.Context, param1: io.particle.android.sdk.cloud.ApiFactory.OauthBasicAuthCredentialsProvider): void;
+ public static init(param0: globalAndroid.content.Context): void;
+ }
+ export class ParticleEvent {
+ public static class: java.lang.Class;
+ public deviceId: string;
+ public dataPayload: string;
+ public publishedAt: java.util.Date;
+ public timeToLive: number;
+ public constructor(param0: string, param1: string, param2: java.util.Date, param3: number);
+ }
+ export class ParticleEventHandler {
+ public static class: java.lang.Class;
+ /**
+ * Constructs a new instance of the io.particle.android.sdk.cloud.ParticleEventHandler interface with the provided implementation. An empty constructor exists calling super() when extending the interface class.
+ */
+ public constructor(implementation: {
+ onEventError(param0: java.lang.Exception): void;
+ onEvent(param0: string, param1: io.particle.android.sdk.cloud.ParticleEvent): void;
+ });
+ public constructor();
+ public onEventError(param0: java.lang.Exception): void;
+ public onEvent(param0: string, param1: io.particle.android.sdk.cloud.ParticleEvent): void;
+ }
+ }
+ }
+ }
+ }
+}
+
+let cachedDevices: Array;
+
+class MyTNSParticleDevice implements TNSParticleDevice {
+ id: string;
+ name: string;
+ status: string;
+ type: TNSParticleDeviceType;
+ functions: Array;
+ variables: Array;
+ eventIds: string[];
+
+ constructor(public particleDevice: any) {
+ this.id = particleDevice.getID();
+ this.name = particleDevice.getName();
+ this.status = particleDevice.getStatus();
+ this.type = getDeviceType(particleDevice.getProductID());
+ this.functions = toJsArray(particleDevice.getFunctions());
+ this.variables = toJsonVariables(particleDevice.getVariables());
+ this.eventIds = [];
+ }
+
+ getVariable(name: string): Promise {
+ return new Promise((resolve, reject) => {
+ try {
+ const result: any = this.particleDevice.getVariable(name);
+ const className = result.getClass ? result.getClass().getName() : "default";
+ switch (className) {
+ case "java.lang.Integer":
+ case "java.lang.Long":
+ case "java.lang.Double":
+ resolve(Number(String(result)));
+ break;
+ default:
+ resolve(String(result));
+ }
+ } catch (e) {
+ reject(e.nativeException.getBestMessage());
+ }
+ });
+ }
+
+ callFunction(name: string, ...args): Promise {
+ return new Promise((resolve, reject) => {
+ try {
+ resolve(this.particleDevice.callFunction(name, java.util.Arrays.asList(args)));
+ } catch (e) {
+ reject(e.nativeException.getBestMessage());
+ }
+ });
+ }
+
+ subscribe(name: string, eventHandler: any): void {
+ try {
+ var handler = new io.particle.android.sdk.cloud.ParticleEventHandler({
+ onEventError(param0: java.lang.Exception){
+ (global).postMessage({success: kCMTextDisplayFlag_allSubtitlesForced});
+ },
+ onEvent(param0: string, param1: io.particle.android.sdk.cloud.ParticleEvent){
+ if (param1)
+ (global).postMessage({success: true, data: {data: param1.dataPayload, name: param0}});
+ }
+ });
+ var id = this.particleDevice.subscribeToEvents(null, handler);
+ this.eventIds.push(id);
+ } catch (e) {
+ console.log(e.nativeException.getBestMessage());
+ }
+ }
+
+ unsubscribe(): void {
+ this.eventIds.forEach(element => {
+ this.particleDevice.unsubscribeFromEvents(element);
+ });
+ this.eventIds = [];
+ }
+}
+
+const toJsArray = (nativeSet: java.util.Set): Array => {
+ const result: Array = [];
+ if (nativeSet) {
+ const it = nativeSet.iterator();
+ while (it.hasNext()) {
+ result.push(it.next());
+ }
+ }
+ return result;
+};
+
+const toJsonVariables = (nativeMap: java.util.Map): Array => {
+ const result: Array = [];
+ if (nativeMap) {
+ const it = nativeMap.keySet().iterator();
+ while (it.hasNext()) {
+ const name = it.next();
+ const type = nativeMap.get(name).toString();
+ result.push({name, type});
+ }
+ }
+ return result;
+};
+
+
+const listDevices = (): void => {
+ console.log(`worker2 listdevices`);
+
+ try {
+ const particleDevices = ParticleCloudSDK.getCloud().getDevices();
+ cachedDevices = [];
+ for (let i = 0; i < particleDevices.size(); i++) {
+ cachedDevices.push(new MyTNSParticleDevice(particleDevices.get(i)));
+ }
+ console.log(`worker 2 got devices`);
+
+ // (global).postMessage({success: true, devices: cachedDevices});
+ } catch (e) {
+ // (global).postMessage({success: false, error: e.nativeException.getBestMessage()});
+ }
+};
+
+const subcribeFunction = (device: TNSParticleDevice, name: string): void => {
+ device.subscribe(name, null);
+};
+
+const unsubcribeFunction = (device: TNSParticleDevice): void => {
+ device.unsubscribe();
+};
+
+const getDevice = (id: string): TNSParticleDevice => {
+ return cachedDevices.filter(cachedDevice => cachedDevice.id === id)[0];
+};
+
+(global).onmessage = msg => {
+ let request = msg.data;
+
+ if (request.action === "listDevices") {
+ listDevices();
+ return;
+ } else if (request.action === "subscribe") {
+ subcribeFunction(getDevice(request.options.deviceId), request.options.name);
+ return;
+ } else if (request.action === "unsubscribe") {
+ unsubcribeFunction(getDevice(request.options.deviceId));
+ return;
+ } else {
+ (global).postMessage({success: false, error: `Unsupported action sent to worker: '${request.action}'`});
+ }
+};
diff --git a/src/particle-worker.ts b/src/particle-worker.ts
index ce5057e..480d27d 100644
--- a/src/particle-worker.ts
+++ b/src/particle-worker.ts
@@ -7,8 +7,46 @@ import {
TNSParticleDeviceType
} from "./particle.common";
-declare const io: any;
+// declare const io: any;
const ParticleCloudSDK = io.particle.android.sdk.cloud.ParticleCloudSDK;
+declare module io {
+ export module particle {
+ export module android {
+ export module sdk {
+ export module cloud {
+ export class ParticleCloudSDK {
+ public static class: java.lang.Class;
+ public static getCloud(): any;
+ // public static initWithOauthCredentialsProvider(param0: globalAndroid.content.Context, param1: io.particle.android.sdk.cloud.ApiFactory.OauthBasicAuthCredentialsProvider): void;
+ public static init(param0: globalAndroid.content.Context): void;
+ }
+ export class ParticleEvent {
+ public static class: java.lang.Class;
+ public deviceId: string;
+ public dataPayload: string;
+ public publishedAt: java.util.Date;
+ public timeToLive: number;
+ public constructor(param0: string, param1: string, param2: java.util.Date, param3: number);
+ }
+ export class ParticleEventHandler {
+ public static class: java.lang.Class;
+ /**
+ * Constructs a new instance of the io.particle.android.sdk.cloud.ParticleEventHandler interface with the provided implementation. An empty constructor exists calling super() when extending the interface class.
+ */
+ public constructor(implementation: {
+ onEventError(param0: java.lang.Exception): void;
+ onEvent(param0: string, param1: io.particle.android.sdk.cloud.ParticleEvent): void;
+ });
+ public constructor();
+ public onEventError(param0: java.lang.Exception): void;
+ public onEvent(param0: string, param1: io.particle.android.sdk.cloud.ParticleEvent): void;
+ }
+ }
+ }
+ }
+ }
+}
+
let cachedDevices: Array;
class MyTNSParticleDevice implements TNSParticleDevice {
@@ -18,14 +56,16 @@ class MyTNSParticleDevice implements TNSParticleDevice {
type: TNSParticleDeviceType;
functions: Array;
variables: Array;
+ eventIds: string[];
constructor(public particleDevice: any) {
this.id = particleDevice.getID();
this.name = particleDevice.getName();
- this.status = particleDevice.getStatus();
+ this.status = particleDevice.isConnected() ? particleDevice.getStatus() : "offline";
this.type = getDeviceType(particleDevice.getProductID());
this.functions = toJsArray(particleDevice.getFunctions());
this.variables = toJsonVariables(particleDevice.getVariables());
+ this.eventIds = [];
}
getVariable(name: string): Promise {
@@ -57,6 +97,29 @@ class MyTNSParticleDevice implements TNSParticleDevice {
}
});
}
+
+ subscribe(name: string, eventHandler: any): void {
+ try {
+ var handler = new io.particle.android.sdk.cloud.ParticleEventHandler({
+ onEventError(param0: java.lang.Exception){
+ (global).postMessage({success: kCMTextDisplayFlag_allSubtitlesForced});
+ },
+ onEvent(param0: string, param1: io.particle.android.sdk.cloud.ParticleEvent){
+ (global).postMessage({success: true, data: param1.dataPayload});
+ }
+ });
+ var id = this.particleDevice.subscribeToEvents(null, handler);
+ this.eventIds.push(id);
+ } catch (e) {
+ console.log(e.nativeException.getBestMessage());
+ }
+ }
+
+ unsubscribe(): void {
+ this.eventIds.forEach(element => {
+ this.particleDevice.unsubscribeFromEvents(element);
+ });
+ }
}
const toJsArray = (nativeSet: java.util.Set): Array => {
@@ -117,6 +180,14 @@ const callFunction = (device: TNSParticleDevice, name: string, args): void => {
.catch(error => (global).postMessage({success: false, error}));
};
+const subcribeFunction = (device: TNSParticleDevice, name: string): void => {
+ device.subscribe(name, null);
+};
+
+const unsubcribeFunction = (device: TNSParticleDevice): void => {
+ device.unsubscribe();
+};
+
const getDevice = (id: string): TNSParticleDevice => {
return cachedDevices.filter(cachedDevice => cachedDevice.id === id)[0];
};
@@ -136,6 +207,12 @@ const getDevice = (id: string): TNSParticleDevice => {
} else if (request.action === "getVariable") {
getVariable(getDevice(request.options.deviceId), request.options.name);
return;
+ } else if (request.action === "subscribe") {
+ subcribeFunction(getDevice(request.options.deviceId), request.options.name);
+ return;
+ } else if (request.action === "unsubscribe") {
+ unsubcribeFunction(getDevice(request.options.deviceId));
+ return;
} else {
(global).postMessage({success: false, error: `Unsupported action sent to worker: '${request.action}'`});
}
diff --git a/src/particle.android.ts b/src/particle.android.ts
index 437f302..5eebd6a 100644
--- a/src/particle.android.ts
+++ b/src/particle.android.ts
@@ -3,6 +3,8 @@ import * as utils from "tns-core-modules/utils/utils";
// keep this baby active while logged in as it holds state (our devices)
let worker;
+let eventWorker;
+var cbArr: any = undefined;
declare const io: any;
const ParticleCloudSDK = io.particle.android.sdk.cloud.ParticleCloudSDK;
@@ -31,10 +33,25 @@ export class Particle implements TNSParticleAPI {
});
}
+ public loginWithToken(token: string): void {
+ ParticleCloudSDK.getCloud().setAccessToken(token);
+ if (global["TNS_WEBPACK"]) {
+ const WorkerScript = require("nativescript-worker-loader!./particle-worker.js");
+ worker = new WorkerScript();
+ } else {
+ worker = new Worker("./particle-worker.js");
+ }
+ }
+
+ public setOAuthConfig(id: string, secret: string): void {
+
+ }
+
public logout(): void {
// no need for a worker here because there are no network calls involved
ParticleCloudSDK.getCloud().logOut();
- worker.terminate();
+ if (worker) worker.terminate();
+ if (eventWorker) eventWorker.terminate();
}
public listDevices(): Promise> {
@@ -42,6 +59,7 @@ export class Particle implements TNSParticleAPI {
worker.postMessage({
action: "listDevices"
});
+
worker.onmessage = msg => {
if (msg.data.success) {
@@ -50,7 +68,23 @@ export class Particle implements TNSParticleAPI {
devices.map(device => {
device.callFunction = (name: string, args): Promise => this.callFunction(device.id, name, args);
device.getVariable = (name: string): Promise => this.getVariable(device.id, name);
+ device.subscribe = (name: string, eventHandler: any): void => this.subscribe(device.id, name, eventHandler);
+ device.unsubscribe = (): void => this.unsubscribe(device.id);
+ });
+
+ // start event subscription worker and get device list
+ if (!eventWorker) {
+ if (global["TNS_WEBPACK"]) {
+ const EventWorkerScript = require("nativescript-worker-loader!./particle-event-worker.js");
+ eventWorker = new EventWorkerScript();
+ } else {
+ eventWorker = new Worker("./particle-event-worker.js");
+ }
+ }
+ eventWorker.postMessage({
+ action: "listDevices"
});
+
resolve(devices);
} else {
reject(msg.data.error);
@@ -87,4 +121,55 @@ export class Particle implements TNSParticleAPI {
worker.onmessage = msg => msg.data.success ? resolve(msg.data.result) : reject(msg.data.error);
});
}
+
+ private unsubscribe(deviceId: string): void {
+ eventWorker.postMessage({
+ action: "unsubscribe",
+ options: {
+ deviceId}
+ });
+ cbArr = undefined;
+ }
+
+ private subscribe(deviceId: string, name: string, eventHandler: any): void {
+ if (cbArr == undefined) {
+ cbArr = {};
+ }
+ cbArr[name] = eventHandler;
+ console.dir(cbArr);
+
+ eventWorker.postMessage({
+ action: "subscribe",
+ options: {
+ deviceId,
+ name
+ }
+ });
+
+ eventWorker.onmessage = (msg) => {
+ if (msg.data.success) {
+ const d = msg.data.data;
+ // console.log(`${d.name}: ${d.data}`);
+ var cb : (any) => any;
+ cb = cbArr[d.name];
+ if (cb) cb(d.data);
+ }
+ }
+ }
+
+ public isAuthenticated(): Boolean {
+ return ParticleCloudSDK.getCloud().isLoggedIn();
+}
+
+ public accessToken(): string {
+ return ParticleCloudSDK.getCloud().getAccessToken();
+ }
+
+ public startDeviceSetupWizard(cb:any): void {
+ // stub for startDeviceSetupWizard
+ }
+
+ public getDeviceSetupCustomizer(): any {
+ // stub for getDeviceSetupCustomizer
+ }
}
diff --git a/src/particle.common.ts b/src/particle.common.ts
index b0357d1..d8cf6ee 100644
--- a/src/particle.common.ts
+++ b/src/particle.common.ts
@@ -7,7 +7,8 @@ export type TNSParticleDeviceType =
| "RaspberryPi"
| "DigistumpOak"
| "RedBearDuo"
- | "Bluz";
+ | "Bluz"
+ | "GFConical";
export type VariableType = "INT" | "DOUBLE" | "STRING";
@@ -29,6 +30,8 @@ export function getDeviceType(id: number): TNSParticleDeviceType {
return "RedBearDuo";
case 103:
return "Bluz";
+ case 7822:
+ return "GFConical";
default:
console.log(`Unknown device type (id: ${id})`);
return "Unknown";
@@ -47,8 +50,11 @@ export interface TNSParticleDevice {
type: TNSParticleDeviceType;
functions: Array;
variables: Array;
+ eventIds: string[];
getVariable: (name: string) => Promise;
callFunction: (name: string, ...args) => Promise;
+ subscribe: (name: string, eventHandler:any) => void;
+ unsubscribe: () => void;
}
export interface TNSParticleLoginOptions {
@@ -57,9 +63,15 @@ export interface TNSParticleLoginOptions {
}
export interface TNSParticleAPI {
- login(options: TNSParticleLoginOptions): Promise;
+ login(options: TNSParticleLoginOptions): Promise;
+ loginWithToken(token: string): void;
+ setOAuthConfig(id: string, secret: string): void;
logout(): void;
-
+ isAuthenticated(): Boolean;
+ accessToken(): string;
listDevices(): Promise>;
+ startDeviceSetupWizard(finishHandler: any): void;
+ getDeviceSetupCustomizer(): any;
}
+
diff --git a/src/particle.ios.ts b/src/particle.ios.ts
index 957e2f4..19f2da0 100644
--- a/src/particle.ios.ts
+++ b/src/particle.ios.ts
@@ -6,6 +6,7 @@ import {
TNSParticleDeviceVariable,
TNSParticleLoginOptions
} from "./particle.common";
+import * as frameModule from 'tns-core-modules/ui/frame';
const toJsArray = (nativeArray: NSArray): Array => {
const result: Array = [];
@@ -17,6 +18,7 @@ const toJsArray = (nativeArray: NSArray): Array => {
return result;
};
+
const toJsonVariables = (nativeDictionary: NSDictionary): Array => {
const result: Array = [];
if (nativeDictionary) {
@@ -51,7 +53,8 @@ class MyTNSParticleDevice implements TNSParticleDevice {
type: TNSParticleDeviceType;
functions: Array;
variables: Array;
-
+ eventIds: string[] = [];
+
constructor(public nativeDevice: ParticleDevice) {
this.id = nativeDevice.id;
this.name = nativeDevice.name;
@@ -81,10 +84,29 @@ class MyTNSParticleDevice implements TNSParticleDevice {
}
});
}
+
+ subscribe(name: string, eventHandler:any): void {
+ const id = this.nativeDevice.subscribeToEventsWithPrefixHandler(name, (event: ParticleEvent, error: NSError) => {
+ if (!error){
+ if (event.data) eventHandler(event.data);
+ } else {
+ console.log(`Error subscribing to event: ${error}`);
+ }
+ });
+ this.eventIds.push(id);
+ }
+
+ unsubscribe(): void {
+ this.eventIds.forEach(element => {
+ this.nativeDevice.unsubscribeFromEventWithID(element);
+ });
+ }
}
export class Particle implements TNSParticleAPI {
+ private wizardDelegate : ParticleSetupControllerDelegateImpl;
+
public login(options: TNSParticleLoginOptions): Promise {
return new Promise((resolve, reject) => {
try {
@@ -98,10 +120,27 @@ export class Particle implements TNSParticleAPI {
});
}
+ public loginWithToken(token: string): void {
+ ParticleCloud.sharedInstance().injectSessionAccessToken(token);
+ }
+
+ public setOAuthConfig(id:string, secret:string): void{
+ ParticleCloud.sharedInstance().oAuthClientId = id;
+ ParticleCloud.sharedInstance().oAuthClientSecret = secret;
+ }
+
public logout(): void {
ParticleCloud.sharedInstance().logout();
}
+ public isAuthenticated(): Boolean {
+ return ParticleCloud.sharedInstance().isAuthenticated;
+}
+
+ public accessToken(): string {
+ return ParticleCloud.sharedInstance().accessToken;
+ }
+
public listDevices(): Promise> {
return new Promise>((resolve, reject) => {
ParticleCloud.sharedInstance().getDevices((particleDevices: NSArray, error: NSError) => {
@@ -118,4 +157,46 @@ export class Particle implements TNSParticleAPI {
});
});
}
+
+ public startDeviceSetupWizard(finishHandler: any): void{
+ console.log('Particle.startDeviceSetup');
+ const setupController = new ParticleSetupMainController();
+ this.wizardDelegate = new ParticleSetupControllerDelegateImpl();
+ this.wizardDelegate.cb = finishHandler;
+ setupController.delegate = this.wizardDelegate;
+ var ctrl = frameModule.topmost().ios.controller;
+ ctrl.navigationBarHidden = true;
+ ctrl.pushViewControllerAnimated(setupController, true);
+ }
+
+ public getDeviceSetupCustomizer(): any{
+ return ParticleSetupCustomization.sharedInstance();
+ }
+}
+
+
+declare var ParticleSetupMainController : any;
+declare var ParticleSetupCustomization : any;
+class ParticleSetupControllerDelegateImpl extends NSObject implements ParticleSetupMainControllerDelegate {
+ static ObjCProtocols = [ParticleSetupMainControllerDelegate] // define our native protocalls
+
+ static new(): ParticleSetupControllerDelegateImpl {
+ return super.new() // calls new() on the NSObject
+ }
+ cb :any;
+
+ public particleSetupViewControllerDidFinishWithResultDevice(controller, result, device){
+ console.log('particleSetupViewControllerDidFinishWithResultDevice');
+
+ if(this.cb){
+ this.cb(result);
+ }
+ }
+}
+interface ParticleSetupMainControllerDelegate {
+ particleSetupViewControllerDidFinishWithResultDevice(controller: any, result: any, device: any): void;
+ particleSetupViewControllerDidNotSucceeedWithDeviceID?(controller: any, deviceID: string): void;
}
+declare var ParticleSetupMainControllerDelegate: {
+ prototype: ParticleSetupMainControllerDelegate;
+};
\ No newline at end of file
diff --git a/src/platforms/ios/Podfile b/src/platforms/ios/Podfile
index 57b1c9e..04070b2 100644
--- a/src/platforms/ios/Podfile
+++ b/src/platforms/ios/Podfile
@@ -1 +1,2 @@
pod 'Particle-SDK', '~> 0.8'
+pod 'ParticleSetup'
\ No newline at end of file