How to use this.setWifiState method in Appium Android Driver

Best JavaScript code snippet using appium-android-driver

location-678d6ac1.js

Source:location-678d6ac1.js Github

copy

Full Screen

1import { l as Plugins, r as registerPlugin, W as Webapi, a as storage } from './webapi-4204925e.js';2import { _ as __extends, c as cordova$1, e as Injectable, I as IonicNativePlugin, b as cordovaPropertyGet, d as cordovaPropertySet, m as msg, u as util } from './navigation-c2948117.js';3var LocationAccuracy = /** @class */ (function (_super) {4 __extends(LocationAccuracy, _super);5 function LocationAccuracy() {6 var _this = _super !== null && _super.apply(this, arguments) || this;7 /**8 * Convenience constant9 * @type {number}10 */11 _this.REQUEST_PRIORITY_NO_POWER = 0;12 /**13 * Convenience constant14 * @type {number}15 */16 _this.REQUEST_PRIORITY_LOW_POWER = 1;17 /**18 * Convenience constant19 * @type {number}20 */21 _this.REQUEST_PRIORITY_BALANCED_POWER_ACCURACY = 2;22 /**23 * Convenience constant24 * @type {number}25 */26 _this.REQUEST_PRIORITY_HIGH_ACCURACY = 3;27 /**28 * Convenience constant29 * @type {number}30 */31 _this.SUCCESS_SETTINGS_SATISFIED = 0;32 /**33 * Convenience constant34 * @type {number}35 */36 _this.SUCCESS_USER_AGREED = 1;37 /**38 * Convenience constant39 * @type {number}40 */41 _this.ERROR_ALREADY_REQUESTING = -1;42 /**43 * Convenience constant44 * @type {number}45 */46 _this.ERROR_INVALID_ACTION = 0;47 /**48 * Convenience constant49 * @type {number}50 */51 _this.ERROR_INVALID_ACCURACY = 1;52 /**53 * Convenience constant54 * @type {number}55 */56 _this.ERROR_EXCEPTION = 1;57 /**58 * Convenience constant59 * @type {number}60 */61 _this.ERROR_CANNOT_CHANGE_ACCURACY = 3;62 /**63 * Convenience constant64 * @type {number}65 */66 _this.ERROR_USER_DISAGREED = 4;67 /**68 * Convenience constant69 * @type {number}70 */71 _this.ERROR_GOOGLE_API_CONNECTION_FAILED = 4;72 return _this;73 }74 LocationAccuracy.prototype.canRequest = function () { return cordova$1(this, "canRequest", {}, arguments); };75 LocationAccuracy.prototype.isRequesting = function () { return cordova$1(this, "isRequesting", {}, arguments); };76 LocationAccuracy.prototype.request = function (accuracy) { return cordova$1(this, "request", { "callbackOrder": "reverse" }, arguments); };77 LocationAccuracy.pluginName = "LocationAccuracy";78 LocationAccuracy.plugin = "cordova-plugin-request-location-accuracy";79 LocationAccuracy.pluginRef = "cordova.plugins.locationAccuracy";80 LocationAccuracy.repo = "https://github.com/dpa99c/cordova-plugin-request-location-accuracy";81 LocationAccuracy.platforms = ["Android", "iOS"];82 LocationAccuracy.decorators = [83 { type: Injectable }84 ];85 return LocationAccuracy;86}(IonicNativePlugin));87var Diagnostic = /** @class */ (function (_super) {88 __extends(Diagnostic, _super);89 function Diagnostic() {90 var _this = _super !== null && _super.apply(this, arguments) || this;91 _this.permission = {92 READ_CALENDAR: 'READ_CALENDAR',93 WRITE_CALENDAR: 'WRITE_CALENDAR',94 CAMERA: 'CAMERA',95 READ_CONTACTS: 'READ_CONTACTS',96 WRITE_CONTACTS: 'WRITE_CONTACTS',97 GET_ACCOUNTS: 'GET_ACCOUNTS',98 ACCESS_FINE_LOCATION: 'ACCESS_FINE_LOCATION',99 ACCESS_COARSE_LOCATION: 'ACCESS_COARSE_LOCATION',100 RECORD_AUDIO: 'RECORD_AUDIO',101 READ_PHONE_STATE: 'READ_PHONE_STATE',102 CALL_PHONE: 'CALL_PHONE',103 ADD_VOICEMAIL: 'ADD_VOICEMAIL',104 USE_SIP: 'USE_SIP',105 PROCESS_OUTGOING_CALLS: 'PROCESS_OUTGOING_CALLS',106 READ_CALL_LOG: 'READ_CALL_LOG',107 WRITE_CALL_LOG: 'WRITE_CALL_LOG',108 SEND_SMS: 'SEND_SMS',109 RECEIVE_SMS: 'RECEIVE_SMS',110 READ_SMS: 'READ_SMS',111 RECEIVE_WAP_PUSH: 'RECEIVE_WAP_PUSH',112 RECEIVE_MMS: 'RECEIVE_MMS',113 WRITE_EXTERNAL_STORAGE: 'WRITE_EXTERNAL_STORAGE',114 READ_EXTERNAL_STORAGE: 'READ_EXTERNAL_STORAGE',115 BODY_SENSORS: 'BODY_SENSORS',116 };117 _this.locationAuthorizationMode = {118 ALWAYS: 'always',119 WHEN_IN_USE: 'when_in_use',120 };121 _this.permissionGroups = {122 CALENDAR: ['READ_CALENDAR', 'WRITE_CALENDAR'],123 CAMERA: ['CAMERA'],124 CONTACTS: ['READ_CONTACTS', 'WRITE_CONTACTS', 'GET_ACCOUNTS'],125 LOCATION: ['ACCESS_FINE_LOCATION', 'ACCESS_COARSE_LOCATION'],126 MICROPHONE: ['RECORD_AUDIO'],127 PHONE: [128 'READ_PHONE_STATE',129 'CALL_PHONE',130 'ADD_VOICEMAIL',131 'USE_SIP',132 'PROCESS_OUTGOING_CALLS',133 'READ_CALL_LOG',134 'WRITE_CALL_LOG',135 ],136 SENSORS: ['BODY_SENSORS'],137 SMS: ['SEND_SMS', 'RECEIVE_SMS', 'READ_SMS', 'RECEIVE_WAP_PUSH', 'RECEIVE_MMS'],138 STORAGE: ['READ_EXTERNAL_STORAGE', 'WRITE_EXTERNAL_STORAGE'],139 };140 _this.locationMode = {141 HIGH_ACCURACY: 'high_accuracy',142 DEVICE_ONLY: 'device_only',143 BATTERY_SAVING: 'battery_saving',144 LOCATION_OFF: 'location_off',145 };146 _this.bluetoothState = {147 UNKNOWN: 'unknown',148 RESETTING: 'resetting',149 UNSUPPORTED: 'unsupported',150 UNAUTHORIZED: 'unauthorized',151 POWERED_OFF: 'powered_off',152 POWERED_ON: 'powered_on',153 POWERING_OFF: 'powering_off',154 POWERING_ON: 'powering_on',155 };156 return _this;157 }158 Diagnostic.prototype.isLocationAvailable = function () { return cordova$1(this, "isLocationAvailable", {}, arguments); };159 Diagnostic.prototype.isWifiAvailable = function () { return cordova$1(this, "isWifiAvailable", {}, arguments); };160 Diagnostic.prototype.isCameraAvailable = function (externalStorage) { return cordova$1(this, "isCameraAvailable", { "callbackOrder": "reverse" }, arguments); };161 Diagnostic.prototype.isBluetoothAvailable = function () { return cordova$1(this, "isBluetoothAvailable", {}, arguments); };162 Diagnostic.prototype.switchToLocationSettings = function () { return cordova$1(this, "switchToLocationSettings", { "sync": true, "platforms": ["Android", "Windows 10", "iOS"] }, arguments); };163 Diagnostic.prototype.switchToMobileDataSettings = function () { return cordova$1(this, "switchToMobileDataSettings", { "sync": true, "platforms": ["Android", "Windows 10"] }, arguments); };164 Diagnostic.prototype.switchToBluetoothSettings = function () { return cordova$1(this, "switchToBluetoothSettings", { "sync": true, "platforms": ["Android", "Windows 10"] }, arguments); };165 Diagnostic.prototype.switchToWifiSettings = function () { return cordova$1(this, "switchToWifiSettings", { "sync": true, "platforms": ["Android", "Windows 10"] }, arguments); };166 Diagnostic.prototype.isWifiEnabled = function () { return cordova$1(this, "isWifiEnabled", { "platforms": ["Android", "Windows 10"] }, arguments); };167 Diagnostic.prototype.setWifiState = function (state) { return cordova$1(this, "setWifiState", { "callbackOrder": "reverse", "platforms": ["Android", "Windows 10"] }, arguments); };168 Diagnostic.prototype.setBluetoothState = function (state) { return cordova$1(this, "setBluetoothState", { "callbackOrder": "reverse", "platforms": ["Android", "Windows 10"] }, arguments); };169 Diagnostic.prototype.isLocationEnabled = function () { return cordova$1(this, "isLocationEnabled", { "platforms": ["Android", "iOS"] }, arguments); };170 Diagnostic.prototype.isLocationAuthorized = function () { return cordova$1(this, "isLocationAuthorized", {}, arguments); };171 Diagnostic.prototype.getLocationAuthorizationStatus = function () { return cordova$1(this, "getLocationAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };172 Diagnostic.prototype.requestLocationAuthorization = function (mode) { return cordova$1(this, "requestLocationAuthorization", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };173 Diagnostic.prototype.isCameraPresent = function () { return cordova$1(this, "isCameraPresent", { "platforms": ["Android", "iOS"] }, arguments); };174 Diagnostic.prototype.isCameraAuthorized = function (externalStorage) { return cordova$1(this, "isCameraAuthorized", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };175 Diagnostic.prototype.getCameraAuthorizationStatus = function (externalStorage) { return cordova$1(this, "getCameraAuthorizationStatus", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };176 Diagnostic.prototype.requestCameraAuthorization = function (externalStorage) { return cordova$1(this, "requestCameraAuthorization", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };177 Diagnostic.prototype.isMicrophoneAuthorized = function () { return cordova$1(this, "isMicrophoneAuthorized", { "platforms": ["Android", "iOS"] }, arguments); };178 Diagnostic.prototype.getMicrophoneAuthorizationStatus = function () { return cordova$1(this, "getMicrophoneAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };179 Diagnostic.prototype.requestMicrophoneAuthorization = function () { return cordova$1(this, "requestMicrophoneAuthorization", { "platforms": ["Android", "iOS"] }, arguments); };180 Diagnostic.prototype.isContactsAuthorized = function () { return cordova$1(this, "isContactsAuthorized", { "platforms": ["Android", "iOS"] }, arguments); };181 Diagnostic.prototype.getContactsAuthorizationStatus = function () { return cordova$1(this, "getContactsAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };182 Diagnostic.prototype.requestContactsAuthorization = function () { return cordova$1(this, "requestContactsAuthorization", { "platforms": ["Android", "iOS"] }, arguments); };183 Diagnostic.prototype.isCalendarAuthorized = function () { return cordova$1(this, "isCalendarAuthorized", { "platforms": ["Android", "iOS"] }, arguments); };184 Diagnostic.prototype.getCalendarAuthorizationStatus = function () { return cordova$1(this, "getCalendarAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };185 Diagnostic.prototype.requestCalendarAuthorization = function () { return cordova$1(this, "requestCalendarAuthorization", { "platforms": ["Android", "iOS"] }, arguments); };186 Diagnostic.prototype.switchToSettings = function () { return cordova$1(this, "switchToSettings", { "platforms": ["Android", "iOS"] }, arguments); };187 Diagnostic.prototype.getBluetoothState = function () { return cordova$1(this, "getBluetoothState", { "platforms": ["Android", "iOS"] }, arguments); };188 Diagnostic.prototype.registerBluetoothStateChangeHandler = function (handler) { return cordova$1(this, "registerBluetoothStateChangeHandler", { "platforms": ["Android", "iOS"], "sync": true }, arguments); };189 Diagnostic.prototype.registerLocationStateChangeHandler = function (handler) { return cordova$1(this, "registerLocationStateChangeHandler", { "platforms": ["Android", "iOS"], "sync": true }, arguments); };190 Diagnostic.prototype.isGpsLocationAvailable = function () { return cordova$1(this, "isGpsLocationAvailable", { "platforms": ["Android"] }, arguments); };191 Diagnostic.prototype.isGpsLocationEnabled = function () { return cordova$1(this, "isGpsLocationEnabled", { "platforms": ["Android"] }, arguments); };192 Diagnostic.prototype.isNetworkLocationAvailable = function () { return cordova$1(this, "isNetworkLocationAvailable", { "platforms": ["Android"] }, arguments); };193 Diagnostic.prototype.isNetworkLocationEnabled = function () { return cordova$1(this, "isNetworkLocationEnabled", { "platforms": ["Android"] }, arguments); };194 Diagnostic.prototype.getLocationMode = function () { return cordova$1(this, "getLocationMode", { "platforms": ["Android"] }, arguments); };195 Diagnostic.prototype.getPermissionAuthorizationStatus = function (permission) { return cordova$1(this, "getPermissionAuthorizationStatus", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };196 Diagnostic.prototype.getPermissionsAuthorizationStatus = function (permissions) { return cordova$1(this, "getPermissionsAuthorizationStatus", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };197 Diagnostic.prototype.requestRuntimePermission = function (permission) { return cordova$1(this, "requestRuntimePermission", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };198 Diagnostic.prototype.requestRuntimePermissions = function (permissions) { return cordova$1(this, "requestRuntimePermissions", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };199 Diagnostic.prototype.isRequestingPermission = function () { return cordova$1(this, "isRequestingPermission", { "sync": true }, arguments); };200 Diagnostic.prototype.registerPermissionRequestCompleteHandler = function (handler) { return cordova$1(this, "registerPermissionRequestCompleteHandler", { "sync": true }, arguments); };201 Diagnostic.prototype.isBluetoothEnabled = function () { return cordova$1(this, "isBluetoothEnabled", { "platforms": ["Android"] }, arguments); };202 Diagnostic.prototype.hasBluetoothSupport = function () { return cordova$1(this, "hasBluetoothSupport", { "platforms": ["Android"] }, arguments); };203 Diagnostic.prototype.hasBluetoothLESupport = function () { return cordova$1(this, "hasBluetoothLESupport", { "platforms": ["Android"] }, arguments); };204 Diagnostic.prototype.hasBluetoothLEPeripheralSupport = function () { return cordova$1(this, "hasBluetoothLEPeripheralSupport", { "platforms": ["Android"] }, arguments); };205 Diagnostic.prototype.isExternalStorageAuthorized = function () { return cordova$1(this, "isExternalStorageAuthorized", { "platforms": ["Android"] }, arguments); };206 Diagnostic.prototype.getExternalStorageAuthorizationStatus = function () { return cordova$1(this, "getExternalStorageAuthorizationStatus", { "platforms": ["Android"] }, arguments); };207 Diagnostic.prototype.requestExternalStorageAuthorization = function () { return cordova$1(this, "requestExternalStorageAuthorization", { "platforms": ["Android"] }, arguments); };208 Diagnostic.prototype.getExternalSdCardDetails = function () { return cordova$1(this, "getExternalSdCardDetails", { "platforms": ["Android"] }, arguments); };209 Diagnostic.prototype.switchToWirelessSettings = function () { return cordova$1(this, "switchToWirelessSettings", { "platforms": ["Android"], "sync": true }, arguments); };210 Diagnostic.prototype.switchToNFCSettings = function () { return cordova$1(this, "switchToNFCSettings", { "platforms": ["Android"], "sync": true }, arguments); };211 Diagnostic.prototype.isNFCPresent = function () { return cordova$1(this, "isNFCPresent", { "platforms": ["Android"] }, arguments); };212 Diagnostic.prototype.isNFCEnabled = function () { return cordova$1(this, "isNFCEnabled", { "platforms": ["Android"] }, arguments); };213 Diagnostic.prototype.isNFCAvailable = function () { return cordova$1(this, "isNFCAvailable", { "platforms": ["Android"] }, arguments); };214 Diagnostic.prototype.registerNFCStateChangeHandler = function (handler) { return cordova$1(this, "registerNFCStateChangeHandler", { "platforms": ["Android"], "sync": true }, arguments); };215 Diagnostic.prototype.isDataRoamingEnabled = function () { return cordova$1(this, "isDataRoamingEnabled", { "platforms": ["Android"] }, arguments); };216 Diagnostic.prototype.isADBModeEnabled = function () { return cordova$1(this, "isADBModeEnabled", { "platforms": ["Android"] }, arguments); };217 Diagnostic.prototype.isDeviceRooted = function () { return cordova$1(this, "isDeviceRooted", { "platforms": ["Android"] }, arguments); };218 Diagnostic.prototype.isCameraRollAuthorized = function () { return cordova$1(this, "isCameraRollAuthorized", { "platforms": ["iOS"] }, arguments); };219 Diagnostic.prototype.getCameraRollAuthorizationStatus = function () { return cordova$1(this, "getCameraRollAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };220 Diagnostic.prototype.requestCameraRollAuthorization = function () { return cordova$1(this, "requestCameraRollAuthorization", { "platforms": ["iOS"] }, arguments); };221 Diagnostic.prototype.isRemoteNotificationsEnabled = function () { return cordova$1(this, "isRemoteNotificationsEnabled", { "platforms": ["iOS", "Android"] }, arguments); };222 Diagnostic.prototype.isRegisteredForRemoteNotifications = function () { return cordova$1(this, "isRegisteredForRemoteNotifications", { "platforms": ["iOS"] }, arguments); };223 Diagnostic.prototype.getRemoteNotificationsAuthorizationStatus = function () { return cordova$1(this, "getRemoteNotificationsAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };224 Diagnostic.prototype.requestRemoteNotificationsAuthorization = function (types, omitRegistration) { return cordova$1(this, "requestRemoteNotificationsAuthorization", { "platforms": ["iOS"] }, arguments); };225 Diagnostic.prototype.getRemoteNotificationTypes = function () { return cordova$1(this, "getRemoteNotificationTypes", { "platforms": ["iOS"] }, arguments); };226 Diagnostic.prototype.isRemindersAuthorized = function () { return cordova$1(this, "isRemindersAuthorized", { "platforms": ["iOS"] }, arguments); };227 Diagnostic.prototype.getRemindersAuthorizationStatus = function () { return cordova$1(this, "getRemindersAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };228 Diagnostic.prototype.requestRemindersAuthorization = function () { return cordova$1(this, "requestRemindersAuthorization", { "platforms": ["iOS"] }, arguments); };229 Diagnostic.prototype.isBackgroundRefreshAuthorized = function () { return cordova$1(this, "isBackgroundRefreshAuthorized", { "platforms": ["iOS"] }, arguments); };230 Diagnostic.prototype.getBackgroundRefreshStatus = function () { return cordova$1(this, "getBackgroundRefreshStatus", { "platforms": ["iOS"] }, arguments); };231 Diagnostic.prototype.requestBluetoothAuthorization = function () { return cordova$1(this, "requestBluetoothAuthorization", { "platforms": ["iOS"] }, arguments); };232 Diagnostic.prototype.isMotionAvailable = function () { return cordova$1(this, "isMotionAvailable", { "platforms": ["iOS"] }, arguments); };233 Diagnostic.prototype.isMotionRequestOutcomeAvailable = function () { return cordova$1(this, "isMotionRequestOutcomeAvailable", { "platforms": ["iOS"] }, arguments); };234 Diagnostic.prototype.requestMotionAuthorization = function () { return cordova$1(this, "requestMotionAuthorization", { "platforms": ["iOS"] }, arguments); };235 Diagnostic.prototype.getMotionAuthorizationStatus = function () { return cordova$1(this, "getMotionAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };236 Diagnostic.prototype.getLocationAccuracyAuthorization = function () { return cordova$1(this, "getLocationAccuracyAuthorization", { "platform": ["iOS"] }, arguments); };237 Diagnostic.prototype.requestTemporaryFullAccuracyAuthorization = function (purpose) { return cordova$1(this, "requestTemporaryFullAccuracyAuthorization", { "platforms": ["iOS"] }, arguments); };238 Diagnostic.prototype.registerLocationAccuracyAuthorizationChangeHandler = function (handler) { return cordova$1(this, "registerLocationAccuracyAuthorizationChangeHandler", { "platforms": ["iOS"], "sync": true }, arguments); };239 Object.defineProperty(Diagnostic.prototype, "permissionStatus", {240 get: function () { return cordovaPropertyGet(this, "permissionStatus"); },241 set: function (value) { cordovaPropertySet(this, "permissionStatus", value); },242 enumerable: false,243 configurable: true244 });245 Object.defineProperty(Diagnostic.prototype, "NFCState", {246 get: function () { return cordovaPropertyGet(this, "NFCState"); },247 set: function (value) { cordovaPropertySet(this, "NFCState", value); },248 enumerable: false,249 configurable: true250 });251 Object.defineProperty(Diagnostic.prototype, "motionStatus", {252 get: function () { return cordovaPropertyGet(this, "motionStatus"); },253 set: function (value) { cordovaPropertySet(this, "motionStatus", value); },254 enumerable: false,255 configurable: true256 });257 Diagnostic.pluginName = "Diagnostic";258 Diagnostic.plugin = "cordova.plugins.diagnostic";259 Diagnostic.pluginRef = "cordova.plugins.diagnostic";260 Diagnostic.repo = "https://github.com/dpa99c/cordova-diagnostic-plugin";261 Diagnostic.platforms = ["Android", "iOS", "Windows"];262 Diagnostic.decorators = [263 { type: Injectable }264 ];265 return Diagnostic;266}(IonicNativePlugin));267var OpenNativeSettings = /** @class */ (function (_super) {268 __extends(OpenNativeSettings, _super);269 function OpenNativeSettings() {270 return _super !== null && _super.apply(this, arguments) || this;271 }272 OpenNativeSettings.prototype.open = function (setting) { return cordova$1(this, "open", {}, arguments); };273 OpenNativeSettings.pluginName = "OpenNativeSettings";274 OpenNativeSettings.plugin = "cordova-open-native-settings";275 OpenNativeSettings.pluginRef = "cordova.plugins.settings";276 OpenNativeSettings.repo = "https://github.com/guyromb/Cordova-open-native-settings";277 OpenNativeSettings.platforms = ["Android", "iOS"];278 OpenNativeSettings.decorators = [279 { type: Injectable }280 ];281 return OpenNativeSettings;282}(IonicNativePlugin));283var NativeModule = Plugins.BackgroundGeolocation;284var LOG_LEVEL_DEBUG = "debug";285var LOG_LEVEL_NOTICE = "notice";286var LOG_LEVEL_INFO = "info";287var LOG_LEVEL_WARN = "warn";288var LOG_LEVEL_ERROR = "error";289var ORDER_ASC = 1;290var ORDER_DESC = -1;291function log(level, msg) {292 return NativeModule.log({293 level: level,294 message: msg295 });296}297function validateQuery(query) {298 if (typeof (query) !== 'object')299 return {};300 if (query.hasOwnProperty('start') && isNaN(query.start)) {301 throw new Error('Invalid SQLQuery.start. Expected unix timestamp but received: ' + query.start);302 }303 if (query.hasOwnProperty('end') && isNaN(query.end)) {304 throw new Error('Invalid SQLQuery.end. Expected unix timestamp but received: ' + query.end);305 }306 return query;307}308var Logger = /** @class */ (function () {309 function Logger() {310 }311 Object.defineProperty(Logger, "ORDER_ASC", {312 get: function () { return ORDER_ASC; },313 enumerable: false,314 configurable: true315 });316 Object.defineProperty(Logger, "ORDER_DESC", {317 get: function () { return ORDER_DESC; },318 enumerable: false,319 configurable: true320 });321 Logger.debug = function (msg) {322 return log(LOG_LEVEL_DEBUG, msg);323 };324 Logger.error = function (msg) {325 return log(LOG_LEVEL_ERROR, msg);326 };327 Logger.warn = function (msg) {328 return log(LOG_LEVEL_WARN, msg);329 };330 Logger.info = function (msg) {331 return log(LOG_LEVEL_INFO, msg);332 };333 Logger.notice = function (msg) {334 return log(LOG_LEVEL_NOTICE, msg);335 };336 Logger.getLog = function (query) {337 query = validateQuery(query);338 return new Promise(function (resolve, reject) {339 NativeModule.getLog({ options: query }).then(function (result) {340 resolve(result.log);341 }).catch(function (error) {342 reject(error.message);343 });344 });345 };346 Logger.destroyLog = function () {347 return new Promise(function (resolve, reject) {348 NativeModule.destroyLog().then(function () {349 resolve();350 }).catch(function (error) {351 reject(error.message);352 });353 });354 };355 Logger.emailLog = function (email, query) {356 query = validateQuery(query);357 return new Promise(function (resolve, reject) {358 NativeModule.emailLog({ email: email, query: query }).then(function (result) {359 resolve(result);360 }).catch(function (error) {361 reject(error.message);362 });363 });364 };365 Logger.uploadLog = function (url, query) {366 query = validateQuery(query);367 return new Promise(function (resolve, reject) {368 NativeModule.emailLog({ url: url, query: query }).then(function () {369 resolve();370 }).catch(function (error) {371 reject(error.message);372 });373 });374 };375 return Logger;376}());377var NativeModule$1 = Plugins.BackgroundGeolocation;378var DEFAULT_URL = 'http://tracker.transistorsoft.com';379var DUMMY_TOKEN = 'DUMMY_TOKEN';380var REFRESH_PAYLOAD = {381 refresh_token: '{refreshToken}'382};383var LOCATIONS_PATH = '/api/locations';384var REFRESH_TOKEN_PATH = '/api/refresh_token';385var TransistorAuthorizationToken = /** @class */ (function () {386 function TransistorAuthorizationToken() {387 }388 TransistorAuthorizationToken.findOrCreate = function (orgname, username, url) {389 if (url === void 0) { url = DEFAULT_URL; }390 return new Promise(function (resolve, reject) {391 NativeModule$1.getTransistorToken({392 org: orgname,393 username: username,394 url: url395 }).then(function (result) {396 if (result.success) {397 var token = result.token;398 token.url = url;399 resolve(token);400 }401 else {402 console.warn('[TransistorAuthorizationToken findOrCreate] ERROR: ', result);403 if (result.status == '403') {404 reject(result);405 return;406 }407 resolve({408 accessToken: DUMMY_TOKEN,409 refreshToken: DUMMY_TOKEN,410 expires: -1,411 url: url412 });413 }414 }).catch(function (error) {415 reject(error);416 });417 });418 };419 TransistorAuthorizationToken.destroy = function (url) {420 if (url === void 0) { url = DEFAULT_URL; }421 return new Promise(function (resolve, reject) {422 NativeModule$1.destroyTransistorToken({ url: url }).then(function () {423 resolve();424 }).catch(function (error) {425 reject(error.message);426 });427 });428 };429 TransistorAuthorizationToken.applyIf = function (config) {430 if (!config.transistorAuthorizationToken)431 return config;432 var token = config.transistorAuthorizationToken;433 delete config.transistorAuthorizationToken;434 config.url = token.url + LOCATIONS_PATH;435 config.authorization = {436 strategy: 'JWT',437 accessToken: token.accessToken,438 refreshToken: token.refreshToken,439 refreshUrl: token.url + REFRESH_TOKEN_PATH,440 refreshPayload: REFRESH_PAYLOAD,441 expires: token.expires442 };443 return config;444 };445 return TransistorAuthorizationToken;446}());447var NativeModule$2 = Plugins.BackgroundGeolocation;448var IGNORE_BATTERY_OPTIMIZATIONS = "IGNORE_BATTERY_OPTIMIZATIONS";449var POWER_MANAGER = "POWER_MANAGER";450var resolveSettingsRequest = function (resolve, request) {451 if (request.lastSeenAt > 0) {452 request.lastSeenAt = new Date(request.lastSeenAt);453 }454 resolve(request);455};456var DeviceSettings = /** @class */ (function () {457 function DeviceSettings() {458 }459 DeviceSettings.isIgnoringBatteryOptimizations = function () {460 return new Promise(function (resolve, reject) {461 NativeModule$2.isIgnoringBatteryOptimizations.then(function (result) {462 resolve(result.isIgnoringBatteryOptimizations);463 }).catch(function (error) {464 reject(error.message);465 });466 });467 };468 DeviceSettings.showIgnoreBatteryOptimizations = function () {469 return new Promise(function (resolve, reject) {470 var args = { action: IGNORE_BATTERY_OPTIMIZATIONS };471 NativeModule$2.requestSettings(args).then(function (result) {472 resolveSettingsRequest(resolve, result);473 }).catch(function (error) {474 reject(error.message);475 });476 });477 };478 DeviceSettings.showPowerManager = function () {479 return new Promise(function (resolve, reject) {480 var args = { action: POWER_MANAGER };481 NativeModule$2.requestSettings(args).then(function (result) {482 resolveSettingsRequest(resolve, result);483 }).catch(function (error) {484 reject(error.message);485 });486 });487 };488 DeviceSettings.show = function (request) {489 return new Promise(function (resolve, reject) {490 var args = { action: request.action };491 NativeModule$2.showSettings(args).then(function () {492 resolve();493 }).catch(function (error) {494 reject(error.message);495 });496 });497 };498 return DeviceSettings;499}());500var Events = {501 BOOT: "boot",502 TERMINATE: "terminate",503 LOCATION: "location",504 HTTP: "http",505 MOTIONCHANGE: "motionchange",506 PROVIDERCHANGE: "providerchange",507 HEARTBEAT: "heartbeat",508 ACTIVITYCHANGE: "activitychange",509 GEOFENCE: "geofence",510 GEOFENCESCHANGE: "geofenceschange",511 SCHEDULE: "schedule",512 CONNECTIVITYCHANGE: "connectivitychange",513 ENABLEDCHANGE: "enabledchange",514 POWERSAVECHANGE: "powersavechange",515 NOTIFICATIONACTION: "notificationaction",516 AUTHORIZATION: "authorization",517};518var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {519 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }520 return new (P || (P = Promise))(function (resolve, reject) {521 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }522 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }523 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }524 step((generator = generator.apply(thisArg, _arguments || [])).next());525 });526};527var __generator = (undefined && undefined.__generator) || function (thisArg, body) {528 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;529 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;530 function verb(n) { return function (v) { return step([n, v]); }; }531 function step(op) {532 if (f) throw new TypeError("Generator is already executing.");533 while (_) try {534 if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;535 if (y = 0, t) op = [op[0] & 2, t.value];536 switch (op[0]) {537 case 0: case 1: t = op; break;538 case 4: _.label++; return { value: op[1], done: false };539 case 5: _.label++; y = op[1]; op = [0]; continue;540 case 7: op = _.ops.pop(); _.trys.pop(); continue;541 default:542 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }543 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }544 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }545 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }546 if (t[2]) _.ops.pop();547 _.trys.pop(); continue;548 }549 op = body.call(thisArg, _);550 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }551 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };552 }553};554var NativeModule$3 = registerPlugin('BackgroundGeolocation');555var TAG = "TSLocationManager";556/// Container for event-subscriptions.557var EVENT_SUBSCRIPTIONS = [];558/// Container for watchPostion subscriptions.559var WATCH_POSITION_SUBSCRIPTIONS = [];560/// Event handler Subscription561///562var Subscription = /** @class */ (function () {563 function Subscription(event, subscription, callback) {564 this.event = event;565 this.subscription = subscription;566 this.callback = callback;567 }568 return Subscription;569}());570/// Validate provided config for #ready, #setConfig, #reset.571var validateConfig = function (config) {572 // Detect obsolete notification* fields and re-map to Notification instance.573 if ((config.notificationPriority) ||574 (config.notificationText) ||575 (config.notificationTitle) ||576 (config.notificationChannelName) ||577 (config.notificationColor) ||578 (config.notificationSmallIcon) ||579 (config.notificationLargeIcon)) {580 console.warn('[BackgroundGeolocation] WARNING: Config.notification* fields (eg: notificationText) are all deprecated in favor of notification: {title: "My Title", text: "My Text"} See docs for "Notification" class');581 config.notification = {582 text: config.notificationText,583 title: config.notificationTitle,584 color: config.notificationColor,585 channelName: config.notificationChannelName,586 smallIcon: config.notificationSmallIcon,587 largeIcon: config.notificationLargeIcon,588 priority: config.notificationPriority589 };590 }591 config = TransistorAuthorizationToken.applyIf(config);592 return config;593};594var LOG_LEVEL_OFF = 0;595var LOG_LEVEL_ERROR$1 = 1;596var LOG_LEVEL_WARNING = 2;597var LOG_LEVEL_INFO$1 = 3;598var LOG_LEVEL_DEBUG$1 = 4;599var LOG_LEVEL_VERBOSE = 5;600var DESIRED_ACCURACY_NAVIGATION = -2;601var DESIRED_ACCURACY_HIGH = -1;602var DESIRED_ACCURACY_MEDIUM = 10;603var DESIRED_ACCURACY_LOW = 100;604var DESIRED_ACCURACY_VERY_LOW = 1000;605var DESIRED_ACCURACY_LOWEST = 3000;606var AUTHORIZATION_STATUS_NOT_DETERMINED = 0;607var AUTHORIZATION_STATUS_RESTRICTED = 1;608var AUTHORIZATION_STATUS_DENIED = 2;609var AUTHORIZATION_STATUS_ALWAYS = 3;610var AUTHORIZATION_STATUS_WHEN_IN_USE = 4;611var NOTIFICATION_PRIORITY_DEFAULT = 0;612var NOTIFICATION_PRIORITY_HIGH = 1;613var NOTIFICATION_PRIORITY_LOW = -1;614var NOTIFICATION_PRIORITY_MAX = 2;615var NOTIFICATION_PRIORITY_MIN = -2;616var ACTIVITY_TYPE_OTHER = 1;617var ACTIVITY_TYPE_AUTOMOTIVE_NAVIGATION = 2;618var ACTIVITY_TYPE_FITNESS = 3;619var ACTIVITY_TYPE_OTHER_NAVIGATION = 4;620var LOCATION_AUTHORIZATION_ALWAYS = "Always";621var LOCATION_AUTHORIZATION_WHEN_IN_USE = "WhenInUse";622var LOCATION_AUTHORIZATION_ANY = "Any";623var PERSIST_MODE_ALL = 2;624var PERSIST_MODE_LOCATION = 1;625var PERSIST_MODE_GEOFENCE = -1;626var PERSIST_MODE_NONE = 0;627var ACCURACY_AUTHORIZATION_FULL = 0;628var ACCURACY_AUTHORIZATION_REDUCED = 1;629/// BackgroundGeolocation JS API630var BackgroundGeolocation = /** @class */ (function () {631 function BackgroundGeolocation() {632 }633 Object.defineProperty(BackgroundGeolocation, "EVENT_BOOT", {634 /// Events635 get: function () { return Events.BOOT; },636 enumerable: false,637 configurable: true638 });639 Object.defineProperty(BackgroundGeolocation, "EVENT_TERMINATE", {640 get: function () { return Events.TERMINATE; },641 enumerable: false,642 configurable: true643 });644 Object.defineProperty(BackgroundGeolocation, "EVENT_LOCATION", {645 get: function () { return Events.LOCATION; },646 enumerable: false,647 configurable: true648 });649 Object.defineProperty(BackgroundGeolocation, "EVENT_MOTIONCHANGE", {650 get: function () { return Events.MOTIONCHANGE; },651 enumerable: false,652 configurable: true653 });654 Object.defineProperty(BackgroundGeolocation, "EVENT_HTTP", {655 get: function () { return Events.HTTP; },656 enumerable: false,657 configurable: true658 });659 Object.defineProperty(BackgroundGeolocation, "EVENT_HEARTBEAT", {660 get: function () { return Events.HEARTBEAT; },661 enumerable: false,662 configurable: true663 });664 Object.defineProperty(BackgroundGeolocation, "EVENT_PROVIDERCHANGE", {665 get: function () { return Events.PROVIDERCHANGE; },666 enumerable: false,667 configurable: true668 });669 Object.defineProperty(BackgroundGeolocation, "EVENT_ACTIVITYCHANGE", {670 get: function () { return Events.ACTIVITYCHANGE; },671 enumerable: false,672 configurable: true673 });674 Object.defineProperty(BackgroundGeolocation, "EVENT_GEOFENCE", {675 get: function () { return Events.GEOFENCE; },676 enumerable: false,677 configurable: true678 });679 Object.defineProperty(BackgroundGeolocation, "EVENT_GEOFENCESCHANGE", {680 get: function () { return Events.GEOFENCESCHANGE; },681 enumerable: false,682 configurable: true683 });684 Object.defineProperty(BackgroundGeolocation, "EVENT_ENABLEDCHANGE", {685 get: function () { return Events.ENABLEDCHANGE; },686 enumerable: false,687 configurable: true688 });689 Object.defineProperty(BackgroundGeolocation, "EVENT_CONNECTIVITYCHANGE", {690 get: function () { return Events.CONNECTIVITYCHANGE; },691 enumerable: false,692 configurable: true693 });694 Object.defineProperty(BackgroundGeolocation, "EVENT_SCHEDULE", {695 get: function () { return Events.SCHEDULE; },696 enumerable: false,697 configurable: true698 });699 Object.defineProperty(BackgroundGeolocation, "EVENT_POWERSAVECHANGE", {700 get: function () { return Events.POWERSAVECHANGE; },701 enumerable: false,702 configurable: true703 });704 Object.defineProperty(BackgroundGeolocation, "EVENT_NOTIFICATIONACTION", {705 get: function () { return Events.NOTIFICATIONACTION; },706 enumerable: false,707 configurable: true708 });709 Object.defineProperty(BackgroundGeolocation, "EVENT_AUTHORIZATION", {710 get: function () { return Events.AUTHORIZATION; },711 enumerable: false,712 configurable: true713 });714 Object.defineProperty(BackgroundGeolocation, "LOG_LEVEL_OFF", {715 get: function () { return LOG_LEVEL_OFF; },716 enumerable: false,717 configurable: true718 });719 Object.defineProperty(BackgroundGeolocation, "LOG_LEVEL_ERROR", {720 get: function () { return LOG_LEVEL_ERROR$1; },721 enumerable: false,722 configurable: true723 });724 Object.defineProperty(BackgroundGeolocation, "LOG_LEVEL_WARNING", {725 get: function () { return LOG_LEVEL_WARNING; },726 enumerable: false,727 configurable: true728 });729 Object.defineProperty(BackgroundGeolocation, "LOG_LEVEL_INFO", {730 get: function () { return LOG_LEVEL_INFO$1; },731 enumerable: false,732 configurable: true733 });734 Object.defineProperty(BackgroundGeolocation, "LOG_LEVEL_DEBUG", {735 get: function () { return LOG_LEVEL_DEBUG$1; },736 enumerable: false,737 configurable: true738 });739 Object.defineProperty(BackgroundGeolocation, "LOG_LEVEL_VERBOSE", {740 get: function () { return LOG_LEVEL_VERBOSE; },741 enumerable: false,742 configurable: true743 });744 Object.defineProperty(BackgroundGeolocation, "ACTIVITY_TYPE_OTHER", {745 get: function () { return ACTIVITY_TYPE_OTHER; },746 enumerable: false,747 configurable: true748 });749 Object.defineProperty(BackgroundGeolocation, "ACTIVITY_TYPE_AUTOMOTIVE_NAVIGATION", {750 get: function () { return ACTIVITY_TYPE_AUTOMOTIVE_NAVIGATION; },751 enumerable: false,752 configurable: true753 });754 Object.defineProperty(BackgroundGeolocation, "ACTIVITY_TYPE_FITNESS", {755 get: function () { return ACTIVITY_TYPE_FITNESS; },756 enumerable: false,757 configurable: true758 });759 Object.defineProperty(BackgroundGeolocation, "ACTIVITY_TYPE_OTHER_NAVIGATION", {760 get: function () { return ACTIVITY_TYPE_OTHER_NAVIGATION; },761 enumerable: false,762 configurable: true763 });764 Object.defineProperty(BackgroundGeolocation, "DESIRED_ACCURACY_NAVIGATION", {765 get: function () { return DESIRED_ACCURACY_NAVIGATION; },766 enumerable: false,767 configurable: true768 });769 Object.defineProperty(BackgroundGeolocation, "DESIRED_ACCURACY_HIGH", {770 get: function () { return DESIRED_ACCURACY_HIGH; },771 enumerable: false,772 configurable: true773 });774 Object.defineProperty(BackgroundGeolocation, "DESIRED_ACCURACY_MEDIUM", {775 get: function () { return DESIRED_ACCURACY_MEDIUM; },776 enumerable: false,777 configurable: true778 });779 Object.defineProperty(BackgroundGeolocation, "DESIRED_ACCURACY_LOW", {780 get: function () { return DESIRED_ACCURACY_LOW; },781 enumerable: false,782 configurable: true783 });784 Object.defineProperty(BackgroundGeolocation, "DESIRED_ACCURACY_VERY_LOW", {785 get: function () { return DESIRED_ACCURACY_VERY_LOW; },786 enumerable: false,787 configurable: true788 });789 Object.defineProperty(BackgroundGeolocation, "DESIRED_ACCURACY_LOWEST", {790 get: function () { return DESIRED_ACCURACY_LOWEST; },791 enumerable: false,792 configurable: true793 });794 Object.defineProperty(BackgroundGeolocation, "AUTHORIZATION_STATUS_NOT_DETERMINED", {795 get: function () { return AUTHORIZATION_STATUS_NOT_DETERMINED; },796 enumerable: false,797 configurable: true798 });799 Object.defineProperty(BackgroundGeolocation, "AUTHORIZATION_STATUS_RESTRICTED", {800 get: function () { return AUTHORIZATION_STATUS_RESTRICTED; },801 enumerable: false,802 configurable: true803 });804 Object.defineProperty(BackgroundGeolocation, "AUTHORIZATION_STATUS_DENIED", {805 get: function () { return AUTHORIZATION_STATUS_DENIED; },806 enumerable: false,807 configurable: true808 });809 Object.defineProperty(BackgroundGeolocation, "AUTHORIZATION_STATUS_ALWAYS", {810 get: function () { return AUTHORIZATION_STATUS_ALWAYS; },811 enumerable: false,812 configurable: true813 });814 Object.defineProperty(BackgroundGeolocation, "AUTHORIZATION_STATUS_WHEN_IN_USE", {815 get: function () { return AUTHORIZATION_STATUS_WHEN_IN_USE; },816 enumerable: false,817 configurable: true818 });819 Object.defineProperty(BackgroundGeolocation, "NOTIFICATION_PRIORITY_DEFAULT", {820 get: function () { return NOTIFICATION_PRIORITY_DEFAULT; },821 enumerable: false,822 configurable: true823 });824 Object.defineProperty(BackgroundGeolocation, "NOTIFICATION_PRIORITY_HIGH", {825 get: function () { return NOTIFICATION_PRIORITY_HIGH; },826 enumerable: false,827 configurable: true828 });829 Object.defineProperty(BackgroundGeolocation, "NOTIFICATION_PRIORITY_LOW", {830 get: function () { return NOTIFICATION_PRIORITY_LOW; },831 enumerable: false,832 configurable: true833 });834 Object.defineProperty(BackgroundGeolocation, "NOTIFICATION_PRIORITY_MAX", {835 get: function () { return NOTIFICATION_PRIORITY_MAX; },836 enumerable: false,837 configurable: true838 });839 Object.defineProperty(BackgroundGeolocation, "NOTIFICATION_PRIORITY_MIN", {840 get: function () { return NOTIFICATION_PRIORITY_MIN; },841 enumerable: false,842 configurable: true843 });844 Object.defineProperty(BackgroundGeolocation, "LOCATION_AUTHORIZATION_ALWAYS", {845 get: function () { return LOCATION_AUTHORIZATION_ALWAYS; },846 enumerable: false,847 configurable: true848 });849 Object.defineProperty(BackgroundGeolocation, "LOCATION_AUTHORIZATION_WHEN_IN_USE", {850 get: function () { return LOCATION_AUTHORIZATION_WHEN_IN_USE; },851 enumerable: false,852 configurable: true853 });854 Object.defineProperty(BackgroundGeolocation, "LOCATION_AUTHORIZATION_ANY", {855 get: function () { return LOCATION_AUTHORIZATION_ANY; },856 enumerable: false,857 configurable: true858 });859 Object.defineProperty(BackgroundGeolocation, "PERSIST_MODE_ALL", {860 get: function () { return PERSIST_MODE_ALL; },861 enumerable: false,862 configurable: true863 });864 Object.defineProperty(BackgroundGeolocation, "PERSIST_MODE_LOCATION", {865 get: function () { return PERSIST_MODE_LOCATION; },866 enumerable: false,867 configurable: true868 });869 Object.defineProperty(BackgroundGeolocation, "PERSIST_MODE_GEOFENCE", {870 get: function () { return PERSIST_MODE_GEOFENCE; },871 enumerable: false,872 configurable: true873 });874 Object.defineProperty(BackgroundGeolocation, "PERSIST_MODE_NONE", {875 get: function () { return PERSIST_MODE_NONE; },876 enumerable: false,877 configurable: true878 });879 Object.defineProperty(BackgroundGeolocation, "ACCURACY_AUTHORIZATION_FULL", {880 get: function () { return ACCURACY_AUTHORIZATION_FULL; },881 enumerable: false,882 configurable: true883 });884 Object.defineProperty(BackgroundGeolocation, "ACCURACY_AUTHORIZATION_REDUCED", {885 get: function () { return ACCURACY_AUTHORIZATION_REDUCED; },886 enumerable: false,887 configurable: true888 });889 Object.defineProperty(BackgroundGeolocation, "logger", {890 get: function () { return Logger; },891 enumerable: false,892 configurable: true893 });894 Object.defineProperty(BackgroundGeolocation, "deviceSettings", {895 get: function () { return DeviceSettings; },896 enumerable: false,897 configurable: true898 });899 BackgroundGeolocation.ready = function (config) {900 return NativeModule$3.ready({ options: validateConfig(config) });901 };902 BackgroundGeolocation.reset = function (config) {903 return NativeModule$3.reset({ options: validateConfig(config) });904 };905 BackgroundGeolocation.start = function () {906 return NativeModule$3.start();907 };908 BackgroundGeolocation.stop = function () {909 return NativeModule$3.stop();910 };911 BackgroundGeolocation.startSchedule = function () {912 return NativeModule$3.startSchedule();913 };914 BackgroundGeolocation.stopSchedule = function () {915 return NativeModule$3.stopSchedule();916 };917 BackgroundGeolocation.startGeofences = function () {918 return NativeModule$3.startGeofences();919 };920 BackgroundGeolocation.setConfig = function (config) {921 return NativeModule$3.setConfig({ options: validateConfig(config) });922 };923 BackgroundGeolocation.getState = function () {924 return NativeModule$3.getState();925 };926 BackgroundGeolocation.changePace = function (isMoving) {927 return new Promise(function (resolve, reject) {928 NativeModule$3.changePace({ isMoving: isMoving }).then(function () {929 resolve();930 }).catch(function (error) {931 reject(error.errorMessage);932 });933 });934 };935 BackgroundGeolocation.getCurrentPosition = function (options) {936 return new Promise(function (resolve, reject) {937 NativeModule$3.getCurrentPosition(options).then(function (result) {938 resolve(result);939 }).catch(function (error) {940 reject(error.code);941 });942 });943 };944 BackgroundGeolocation.watchPosition = function (onLocation, onError, options) {945 var _this = this;946 options = options || {};947 return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {948 var handler, listener;949 return __generator(this, function (_a) {950 switch (_a.label) {951 case 0:952 handler = function (response) {953 if (response.hasOwnProperty("error") && (response.error != null)) {954 if (typeof (onError) === 'function') {955 onError(response.error.code);956 }957 else {958 console.warn('[BackgroundGeolocation watchPostion] DEFAULT ERROR HANDLER. Provide an onError handler to watchPosition to receive this message: ', response.error);959 }960 }961 else {962 onLocation(response);963 }964 };965 return [4 /*yield*/, NativeModule$3.addListener("watchposition", handler)];966 case 1:967 listener = _a.sent();968 NativeModule$3.watchPosition({ options: options }).then(function () {969 WATCH_POSITION_SUBSCRIPTIONS.push(listener);970 resolve();971 }).catch(function (error) {972 listener.remove();973 reject(error.message);974 });975 return [2 /*return*/];976 }977 });978 }); });979 };980 BackgroundGeolocation.stopWatchPosition = function () {981 for (var n = 0; n < WATCH_POSITION_SUBSCRIPTIONS.length; n++) {982 var subscription = WATCH_POSITION_SUBSCRIPTIONS[n];983 subscription.remove();984 }985 return NativeModule$3.stopWatchPosition();986 };987 BackgroundGeolocation.requestPermission = function () {988 return new Promise(function (resolve, reject) {989 NativeModule$3.requestPermission().then(function (result) {990 if (result.success) {991 resolve(result.status);992 }993 else {994 reject(result.status);995 }996 });997 });998 };999 BackgroundGeolocation.requestTemporaryFullAccuracy = function (purpose) {1000 return new Promise(function (resolve, reject) {1001 NativeModule$3.requestTemporaryFullAccuracy({ purpose: purpose }).then(function (result) {1002 resolve(result.accuracyAuthorization);1003 }).catch(function (error) {1004 reject(error.message);1005 });1006 });1007 };1008 BackgroundGeolocation.getProviderState = function () {1009 return NativeModule$3.getProviderState();1010 };1011 /// Locations database1012 ///1013 BackgroundGeolocation.getLocations = function () {1014 return new Promise(function (resolve, reject) {1015 NativeModule$3.getLocations().then(function (result) {1016 resolve(result.locations);1017 }).catch(function (error) {1018 reject(error.message);1019 });1020 });1021 };1022 BackgroundGeolocation.insertLocation = function (params) {1023 return new Promise(function (resolve, reject) {1024 NativeModule$3.insertLocation({ options: params }).then(function (result) {1025 resolve(result.uuid);1026 }).catch(function (error) {1027 reject(error.message);1028 });1029 });1030 };1031 BackgroundGeolocation.destroyLocations = function () {1032 return new Promise(function (resolve, reject) {1033 NativeModule$3.destroyLocations().then(function () {1034 resolve();1035 }).catch(function (error) {1036 reject(error.message);1037 });1038 });1039 };1040 BackgroundGeolocation.destroyLocation = function (uuid) {1041 return new Promise(function (resolve, reject) {1042 NativeModule$3.destroyLocation({ uuid: uuid }).then(function () {1043 resolve();1044 }).catch(function (error) {1045 reject(error.message);1046 });1047 });1048 };1049 BackgroundGeolocation.getCount = function () {1050 return new Promise(function (resolve, reject) {1051 NativeModule$3.getCount().then(function (result) {1052 resolve(result.count);1053 }).catch(function (error) {1054 reject(error.message);1055 });1056 });1057 };1058 BackgroundGeolocation.sync = function () {1059 return new Promise(function (resolve, reject) {1060 NativeModule$3.sync().then(function (result) {1061 resolve(result.locations);1062 }).catch(function (error) {1063 reject(error.message);1064 });1065 });1066 };1067 /// Geofencing1068 ///1069 BackgroundGeolocation.addGeofence = function (params) {1070 return new Promise(function (resolve, reject) {1071 NativeModule$3.addGeofence({ options: params }).then(function () {1072 resolve();1073 }).catch(function (error) {1074 reject(error.message);1075 });1076 });1077 };1078 BackgroundGeolocation.addGeofences = function (params) {1079 return new Promise(function (resolve, reject) {1080 NativeModule$3.addGeofences({ options: params }).then(function () {1081 resolve();1082 }).catch(function (error) {1083 reject(error.message);1084 });1085 });1086 };1087 BackgroundGeolocation.getGeofences = function () {1088 return new Promise(function (resolve, reject) {1089 NativeModule$3.getGeofences().then(function (result) {1090 resolve(result.geofences);1091 }).catch(function (error) {1092 reject(error.message);1093 });1094 });1095 };1096 BackgroundGeolocation.getGeofence = function (identifier) {1097 return new Promise(function (resolve, reject) {1098 if (identifier === null) {1099 reject('identifier is null');1100 return;1101 }1102 NativeModule$3.getGeofence({ identifier: identifier }).then(function (result) {1103 resolve(result);1104 }).catch(function (error) {1105 reject(error.message);1106 });1107 });1108 };1109 BackgroundGeolocation.geofenceExists = function (identifier) {1110 return new Promise(function (resolve, reject) {1111 if (identifier === null) {1112 reject('identifier is null');1113 return;1114 }1115 NativeModule$3.geofenceExists({ identifier: identifier }).then(function (result) {1116 resolve(result.exists);1117 }).catch(function (error) {1118 reject(error.message);1119 });1120 });1121 };1122 BackgroundGeolocation.removeGeofence = function (identifier) {1123 return new Promise(function (resolve, reject) {1124 if (identifier === null) {1125 reject('identifier is null');1126 return;1127 }1128 NativeModule$3.removeGeofence({ identifier: identifier }).then(function () {1129 resolve();1130 }).catch(function (error) {1131 reject(error.message);1132 });1133 });1134 };1135 BackgroundGeolocation.removeGeofences = function (identifiers) {1136 identifiers = identifiers || [];1137 return new Promise(function (resolve, reject) {1138 NativeModule$3.removeGeofences({ identifiers: identifiers }).then(function () {1139 resolve();1140 }).catch(function (error) {1141 reject(error.message);1142 });1143 });1144 };1145 /// Odometer1146 ///1147 BackgroundGeolocation.getOdometer = function () {1148 return new Promise(function (resolve, reject) {1149 NativeModule$3.getOdometer().then(function (result) {1150 resolve(result.odometer);1151 }).catch(function (error) {1152 reject(error.message);1153 });1154 });1155 };1156 BackgroundGeolocation.setOdometer = function (value) {1157 return new Promise(function (resolve, reject) {1158 NativeModule$3.setOdometer({ "odometer": value }).then(function (result) {1159 resolve(result);1160 }).catch(function (error) {1161 reject(error.message);1162 });1163 });1164 };1165 BackgroundGeolocation.resetOdometer = function () {1166 return BackgroundGeolocation.setOdometer(0);1167 };1168 /// Background Tasks1169 ///1170 BackgroundGeolocation.startBackgroundTask = function () {1171 return new Promise(function (resolve, reject) {1172 NativeModule$3.startBackgroundTask().then(function (result) {1173 resolve(result.taskId);1174 }).catch(function (error) {1175 reject(error.message);1176 });1177 });1178 };1179 BackgroundGeolocation.stopBackgroundTask = function (taskId) {1180 return new Promise(function (resolve, reject) {1181 NativeModule$3.stopBackgroundTask({ taskId: taskId }).then(function () {1182 resolve();1183 }).catch(function (error) {1184 reject(error.message);1185 });1186 });1187 };1188 /// @alias stopBackgroundTask1189 BackgroundGeolocation.finish = function (taskId) {1190 return BackgroundGeolocation.stopBackgroundTask(taskId);1191 };1192 BackgroundGeolocation.getDeviceInfo = function () {1193 return NativeModule$3.getDeviceInfo();1194 };1195 BackgroundGeolocation.playSound = function (soundId) {1196 return NativeModule$3.playSound({ soundId: soundId });1197 };1198 BackgroundGeolocation.isPowerSaveMode = function () {1199 return new Promise(function (resolve, reject) {1200 NativeModule$3.isPowerSaveMode().then(function (result) {1201 resolve(result.isPowerSaveMode);1202 }).catch(function (error) {1203 reject(error.message);1204 });1205 });1206 };1207 BackgroundGeolocation.getSensors = function () {1208 return NativeModule$3.getSensors();1209 };1210 /// TransistorAuthorizationToken1211 ///1212 BackgroundGeolocation.findOrCreateTransistorAuthorizationToken = function (orgname, username, url) {1213 return TransistorAuthorizationToken.findOrCreate(orgname, username, url);1214 };1215 BackgroundGeolocation.destroyTransistorAuthorizationToken = function (url) {1216 return TransistorAuthorizationToken.destroy(url);1217 };1218 /// Event Handling1219 ///1220 BackgroundGeolocation.onLocation = function (success, failure) {1221 return BackgroundGeolocation.addListener(Events.LOCATION, success, failure);1222 };1223 BackgroundGeolocation.onMotionChange = function (success) {1224 return BackgroundGeolocation.addListener(Events.MOTIONCHANGE, success);1225 };1226 BackgroundGeolocation.onHttp = function (success) {1227 return BackgroundGeolocation.addListener(Events.HTTP, success);1228 };1229 BackgroundGeolocation.onHeartbeat = function (success) {1230 return BackgroundGeolocation.addListener(Events.HEARTBEAT, success);1231 };1232 BackgroundGeolocation.onProviderChange = function (success) {1233 return BackgroundGeolocation.addListener(Events.PROVIDERCHANGE, success);1234 };1235 BackgroundGeolocation.onActivityChange = function (success) {1236 return BackgroundGeolocation.addListener(Events.ACTIVITYCHANGE, success);1237 };1238 BackgroundGeolocation.onGeofence = function (success) {1239 return BackgroundGeolocation.addListener(Events.GEOFENCE, success);1240 };1241 BackgroundGeolocation.onGeofencesChange = function (success) {1242 return BackgroundGeolocation.addListener(Events.GEOFENCESCHANGE, success);1243 };1244 BackgroundGeolocation.onSchedule = function (success) {1245 return BackgroundGeolocation.addListener(Events.SCHEDULE, success);1246 };1247 BackgroundGeolocation.onEnabledChange = function (success) {1248 return BackgroundGeolocation.addListener(Events.ENABLEDCHANGE, success);1249 };1250 BackgroundGeolocation.onConnectivityChange = function (success) {1251 return BackgroundGeolocation.addListener(Events.CONNECTIVITYCHANGE, success);1252 };1253 BackgroundGeolocation.onPowerSaveChange = function (success) {1254 return BackgroundGeolocation.addListener(Events.POWERSAVECHANGE, success);1255 };1256 BackgroundGeolocation.onNotificationAction = function (success) {1257 return BackgroundGeolocation.addListener(Events.NOTIFICATIONACTION, success);1258 };1259 BackgroundGeolocation.onAuthorization = function (success) {1260 return BackgroundGeolocation.addListener(Events.AUTHORIZATION, success);1261 };1262 ///1263 /// Listen to a plugin event1264 ///1265 BackgroundGeolocation.addListener = function (event, success, failure) {1266 if (!Events[event.toUpperCase()]) {1267 throw (TAG + "#addListener - Unknown event '" + event + "'");1268 }1269 var handler = function (response) {1270 if (response.hasOwnProperty("value")) {1271 response = response.value;1272 }1273 if (response.hasOwnProperty("error") && (response.error != null)) {1274 if (typeof (failure) === 'function') {1275 failure(response.error);1276 }1277 else {1278 success(response);1279 }1280 }1281 else {1282 success(response);1283 }1284 };1285 // Create a flag to capture edge-case where the developer subscribes to an event then IMMEDIATELY calls subscription.remove()1286 // before NativeModule.addListener has resolved.1287 // The developer would have to do something weird like this:1288 // const subscription = BackgroundGeolocation.onLocation(this.onLocation);1289 // subscription.remove();1290 //1291 // The reason for this is I don't want developers to have to await calls to BackgroundGeolocation.onXXX(myHandler).1292 //1293 var isRemoved = false;1294 var subscriptionProxy = {1295 remove: function () {1296 // EmptyFn until NativeModule.addListener resolves and re-writes this function1297 isRemoved = true;1298 console.warn('[BackgroundGeolocation.addListener] Unexpected call to subscription.remove() on subscriptionProxy. Waiting for NativeModule.addListener to resolve.');1299 }1300 };1301 // Now add the listener and re-write subscriptionProxy.remove.1302 NativeModule$3.addListener(event, handler).then(function (listener) {1303 var subscription = new Subscription(event, listener, success);1304 EVENT_SUBSCRIPTIONS.push(subscription);1305 subscriptionProxy.remove = function () {1306 listener.remove();1307 // Remove from EVENT_SUBSCRIPTIONS.1308 if (EVENT_SUBSCRIPTIONS.indexOf(subscription) >= 0) {1309 EVENT_SUBSCRIPTIONS.splice(EVENT_SUBSCRIPTIONS.indexOf(subscription), 1);1310 }1311 };1312 if (isRemoved) {1313 // Caught edge-case. Developer added an event-handler then immediately call subscription.remove().1314 subscriptionProxy.remove();1315 }1316 });1317 return subscriptionProxy;1318 };1319 BackgroundGeolocation.removeListener = function (event, callback) {1320 console.warn('BackgroundGeolocation.removeListener is deprecated. Event-listener methods (eg: onLocation) now return a Subscription instance. Call subscription.remove() on the returned subscription instead. Eg:\nconst subscription = BackgroundGeolocation.onLocation(myLocationHandler)\n...\nsubscription.remove()');1321 return new Promise(function (resolve, reject) {1322 var found = null;1323 for (var n = 0, len = EVENT_SUBSCRIPTIONS.length; n < len; n++) {1324 var sub = EVENT_SUBSCRIPTIONS[n];1325 if ((sub.event === event) && (sub.callback === callback)) {1326 found = sub;1327 break;1328 }1329 }1330 if (found !== null) {1331 EVENT_SUBSCRIPTIONS.splice(EVENT_SUBSCRIPTIONS.indexOf(found), 1);1332 found.subscription.remove();1333 resolve();1334 }1335 else {1336 console.warn(TAG + ' Failed to find listener for event ' + event);1337 reject();1338 }1339 });1340 };1341 BackgroundGeolocation.removeListeners = function () {1342 var _this = this;1343 return new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {1344 return __generator(this, function (_a) {1345 switch (_a.label) {1346 case 0:1347 EVENT_SUBSCRIPTIONS = [];1348 return [4 /*yield*/, NativeModule$3.removeAllEventListeners()];1349 case 1:1350 _a.sent();1351 resolve();1352 return [2 /*return*/];1353 }1354 });1355 }); });1356 };1357 return BackgroundGeolocation;1358}());1359var tracking;1360(function (tracking) {1361 function restart() {1362 if (window.cordova) {1363 clean();1364 gps.showActivationMsg(true, false);1365 }1366 else {1367 msg.danger(util.translate('tracking.usingPC'));1368 }1369 }1370 tracking.restart = restart;1371 async function initiate() {1372 if (window.cordova) {1373 let api = new Webapi();1374 const confToken = (await storage.get('confToken'));1375 const auth = (await api.connect());1376 const trackingData = confToken.tracking;1377 const appName = (await storage.get('flexyApp')).Title;1378 const scheduled = trackingData && trackingData.schedule && trackingData.schedule.length > 0;1379 BackgroundGeolocation.onSchedule(async () => {1380 if (trackingData.holidays.includes(moment().format('YYYY/MM/DD'))) {1381 BackgroundGeolocation.stop();1382 }1383 });1384 BackgroundGeolocation.ready({1385 enableHeadless: true,1386 authorization: {1387 strategy: "JWT",1388 accessToken: auth.bearerToken1389 },1390 httpRootProperty: 'Locations',1391 url: (auth.url + '/webapi/exec/SendLocationData'),1392 params: { "UserId": confToken.user.currentUserId },1393 batchSync: true,1394 maxBatchSize: 20,1395 autoSync: true,1396 notificationTitle: appName + util.translate('tracking.notificationTitle'),1397 notificationText: util.translate('tracking.notificationText') + appName,1398 stationaryRadius: 25,1399 distanceFilter: (trackingData.radius ? trackingData.radius : 50),1400 desiredAccuracy: BackgroundGeolocation.DESIRED_ACCURACY_HIGH,1401 debug: false,1402 startOnBoot: true,1403 stopOnTerminate: false,1404 stopOnStationary: false,1405 stopTimeout: 15,1406 //logLevel: 0,1407 schedule: (scheduled ? trackingData.schedule : [])1408 }).then(async (state) => {1409 if (!state.enabled) {1410 if (scheduled)1411 BackgroundGeolocation.startSchedule();1412 else1413 BackgroundGeolocation.start();1414 }1415 else if (scheduled && !state.schedulerEnabled) {1416 BackgroundGeolocation.startSchedule();1417 }1418 });1419 }1420 else {1421 msg.danger(util.translate('tracking.usingPC'));1422 }1423 }1424 tracking.initiate = initiate;1425 async function syncLocations() {1426 BackgroundGeolocation.sync().then((res) => {1427 console.log(res);1428 }).catch((err) => {1429 console.log(JSON.parse(err));1430 });1431 }1432 tracking.syncLocations = syncLocations;1433 async function checkLogs() {1434 console.log(await BackgroundGeolocation.logger.getLog());1435 }1436 tracking.checkLogs = checkLogs;1437 async function checkState() {1438 if (window.cordova) {1439 console.log(await BackgroundGeolocation.getState());1440 }1441 else {1442 msg.danger(util.translate('tracking.usingPC'));1443 }1444 }1445 tracking.checkState = checkState;1446 function clean() {1447 if (window.cordova) {1448 BackgroundGeolocation.stop();1449 }1450 else {1451 msg.danger(util.translate('tracking.usingPC'));1452 }1453 }1454 tracking.clean = clean;1455 async function getLocations() {1456 if (window.cordova) {1457 return await BackgroundGeolocation.getLocations();1458 }1459 else {1460 msg.danger(util.translate('tracking.usingPC'));1461 }1462 }1463 tracking.getLocations = getLocations;1464 /*export function getSchedule(trackingCnf:TrackingConfig) {1465 let weekDates:Array<String> = util.getNextSevenDates()1466 1467 var holidays = [];1468 weekDates.forEach(day => {1469 if (trackingCnf.holidays.includes(day)) {1470 holidays.push(moment(day).day() + 1);1471 }1472 });1473 var schedule = [];1474 if (trackingCnf.schedule[0] && !holidays.includes(1)) schedule.push(trackingCnf.schedule[0]);1475 if (trackingCnf.schedule[1] && !holidays.includes(2)) schedule.push(trackingCnf.schedule[1]);1476 if (trackingCnf.schedule[2] && !holidays.includes(3)) schedule.push(trackingCnf.schedule[2]);1477 if (trackingCnf.schedule[3] && !holidays.includes(4)) schedule.push(trackingCnf.schedule[3]);1478 if (trackingCnf.schedule[4] && !holidays.includes(5)) schedule.push(trackingCnf.schedule[4]);1479 if (trackingCnf.schedule[5] && !holidays.includes(6)) schedule.push(trackingCnf.schedule[5]);1480 if (trackingCnf.schedule[6] && !holidays.includes(7)) schedule.push(trackingCnf.schedule[6]);1481 return schedule;1482 }*/1483})(tracking || (tracking = {}));1484var gps;1485(function (gps) {1486 let locationAccuracy = new LocationAccuracy;1487 let diagnostic = new Diagnostic;1488 let actBackLocation = false;1489 let deniedAcces = false;1490 /* alert('position.coords.latitude: ' + position.coords.latitude + '\n' +1491 'position.coords.longitude: ' + position.coords.longitude + '\n' +1492 'position.coords.altitude: ' + position.coords.altitude + '\n' +1493 'position.coords.accuracy: ' + position.coords.accuracy + '\n' +1494 'position.coords.altitudeAccuracy: ' + position.coords.altitudeAccuracy + '\n' +1495 'position.coords.heading: ' + position.coords.heading + '\n' +1496 'position.coords.speed: ' + position.coords.speed + '\n' +1497 'position.timestamp: ' + position.timestamp + '\n');1498 */1499 async function getCoords(geoTimeout = 10000, maximumAge = 10) {1500 return new Promise(async (resolve, reject) => {1501 var geoOpt = { maximumAge: maximumAge, timeout: geoTimeout, enableHighAccuracy: true };1502 let id = navigator.geolocation.watchPosition((pos) => {1503 navigator.geolocation.clearWatch(id);1504 resolve(pos);1505 }, (err) => {1506 getCoordsError(err);1507 navigator.geolocation.clearWatch(id);1508 reject(err);1509 throw err;1510 }, geoOpt);1511 });1512 }1513 gps.getCoords = getCoords;1514 function getCoordsError(error) {1515 if (error.code == 3) {1516 msg.danger(util.translate('exceptions.gpstimeout'));1517 }1518 else {1519 alert('code: ' + error.code + '\n' +1520 'message: ' + error.message + '\n');1521 }1522 }1523 function requestGPSPermission(actMsg) {1524 diagnostic.requestLocationAuthorization(diagnostic.locationAuthorizationMode.ALWAYS).then(async (result) => {1525 let openNativeSettings = new OpenNativeSettings;1526 switch (result) {1527 case diagnostic.permissionStatus.DENIED_ALWAYS:1528 openNativeSettings.open('application_details').then(async () => {1529 if (await diagnostic.isLocationAuthorized())1530 askToTurnOnGPS(actMsg);1531 if (await diagnostic.isLocationAuthorized())1532 askToTurnOnGPS(actMsg);1533 if (await diagnostic.isLocationAuthorized())1534 askToTurnOnGPS(actMsg);1535 });1536 break;1537 case diagnostic.permissionStatus.GRANTED:1538 askToTurnOnGPS(actMsg);1539 break;1540 case diagnostic.permissionStatus.GRANTED_WHEN_IN_USE:1541 if (cordova.platformId === 'ios') {1542 openNativeSettings.open('application_details').then(async () => {1543 if (await diagnostic.isLocationAuthorized())1544 askToTurnOnGPS(actMsg);1545 });1546 break;1547 }1548 if (actBackLocation) {1549 if (deniedAcces) {1550 openNativeSettings.open('location').then(async () => {1551 diagnostic.getLocationAuthorizationStatus().then((result) => {1552 if (result === diagnostic.permissionStatus.GRANTED) {1553 askToTurnOnGPS(actMsg);1554 deniedAcces = false;1555 }1556 });1557 });1558 }1559 else1560 deniedAcces = true;1561 }1562 else1563 util.translate('gps.granted');1564 break;1565 }1566 }, err => { if (err.code !== 4)1567 msg.showError('Error requesting location permissions: ' + err.message); });1568 }1569 function askToTurnOnGPS(actMsg) {1570 locationAccuracy.request(locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY).then(async () => {1571 actMsg.dismiss();1572 util.translate('gps.granted');1573 let token = await storage.get('confToken');1574 token.user.backLocationAccepted = true;1575 storage.set('confToken', token);1576 if (actBackLocation) {1577 tracking.clean();1578 tracking.initiate();1579 }1580 }, err => { if (err.code !== 4)1581 msg.showError('Error requesting location permissions: ' + err.message); });1582 }1583 function showActivationMsg(activateBackLocation, permissionRequest) {1584 if (!permissionRequest) {1585 getActivationMsg(null, permissionRequest);1586 }1587 else {1588 actBackLocation = activateBackLocation;1589 diagnostic.getLocationAuthorizationStatus().then((result) => {1590 switch (result) {1591 case diagnostic.permissionStatus.GRANTED:1592 getActivationMsg(true, permissionRequest);1593 break;1594 case diagnostic.permissionStatus.GRANTED_WHEN_IN_USE:1595 if (actBackLocation)1596 getActivationMsg(false, permissionRequest);1597 else1598 getActivationMsg(true, permissionRequest);1599 break;1600 default:1601 getActivationMsg(false, permissionRequest);1602 break;1603 }1604 }, (err) => { msg.showError('Error requesting location permissions: ' + err); });1605 }1606 }1607 gps.showActivationMsg = showActivationMsg;1608 async function getActivationMsg(permission, permissionRequest) {1609 let shown = await storage.get('trackingMsgShown');1610 if ((!shown && !permissionRequest) || ((!permission || await gpsOff()) && permissionRequest)) {1611 storage.set('trackingMsgShown', true);1612 const actMsg = document.createElement('ion-alert');1613 actMsg.header = util.translate('gps.activationMsg');1614 actMsg.message = util.translate('gps.activationSubmsg');1615 actMsg.backdropDismiss = false;1616 actMsg.buttons = [1617 {1618 text: util.translate('gps.policy'),1619 handler: () => {1620 window.location.href = "https://www.flexygo.com/politica-de-privacidad-flexygo-mobile/";1621 return false;1622 }1623 },1624 {1625 text: (permissionRequest ? util.translate('gps.activate') : util.translate('msg.ok')),1626 handler: () => {1627 if (!permissionRequest)1628 return;1629 if (permission)1630 askToTurnOnGPS(actMsg);1631 else1632 requestGPSPermission(actMsg);1633 return false;1634 }1635 }1636 ];1637 document.body.appendChild(actMsg);1638 actMsg.present();1639 }1640 else if (permissionRequest && actBackLocation) {1641 tracking.initiate();1642 }1643 }1644 async function gpsOff() {1645 if (cordova.platformId === 'ios') {1646 return await locationAccuracy.canRequest();1647 }1648 else {1649 let mode = await diagnostic.getLocationMode();1650 if (mode === diagnostic.locationMode.LOCATION_OFF)1651 return true;1652 else1653 return false;1654 }1655 }1656})(gps || (gps = {}));...

Full Screen

Full Screen

controller.js

Source:controller.js Github

copy

Full Screen

1// Test dependencies are required and exposed in common/bootstrap.js2require('../common/bootstrap');3function newTessel(options) {4 var tessel = new Tessel({5 authorized: options.authorized !== undefined ? options.authorized : true,6 connectionType: options.connectionType || 'LAN',7 end() {8 return (options.end && options.end()) || Promise.resolve();9 }10 });11 tessel.name = options.name || 'a';12 options.sandbox.stub(tessel, 'close').callsFake(function() {13 return Promise.resolve();14 });15 return tessel;16}17exports['controller.tessel'] = {18 setUp(done) {19 this.sandbox = sinon.sandbox.create();20 this.warn = this.sandbox.stub(log, 'warn');21 this.info = this.sandbox.stub(log, 'info');22 this.basic = this.sandbox.stub(log, 'basic');23 this.error = this.sandbox.stub(log, 'error');24 done();25 },26 tearDown(done) {27 this.sandbox.restore();28 controller.tessel = null;29 done();30 },31 tesselStartsNull(test) {32 test.expect(1);33 test.equal(controller.tessel, null);34 test.done();35 },36};37exports['controller.setupLocal'] = {38 setUp(done) {39 this.sandbox = sinon.sandbox.create();40 this.warn = this.sandbox.stub(log, 'warn');41 this.info = this.sandbox.stub(log, 'info');42 this.basic = this.sandbox.stub(log, 'basic');43 this.error = this.sandbox.stub(log, 'error');44 this.provisionsetupLocal = this.sandbox.stub(provision, 'setupLocal');45 done();46 },47 tearDown(done) {48 this.sandbox.restore();49 done();50 },51 passthroughCall(test) {52 test.expect(2);53 var options = {};54 controller.setupLocal(options);55 test.equal(this.provisionsetupLocal.callCount, 1);56 test.equal(this.provisionsetupLocal.lastCall.args[0], options);57 test.done();58 },59};60exports['controller.reconcileTessels'] = {61 setUp(done) {62 this.sandbox = sinon.sandbox.create();63 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');64 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');65 this.warn = this.sandbox.stub(log, 'warn');66 this.info = this.sandbox.stub(log, 'info');67 this.basic = this.sandbox.stub(log, 'basic');68 this.error = this.sandbox.stub(log, 'error');69 done();70 },71 tearDown(done) {72 this.sandbox.restore();73 done();74 },75 resolveImmediatelyWhenOnlyOne(test) {76 test.expect(1);77 controller.reconcileTessels([1]).then(reconciled => {78 test.equal(reconciled, 1);79 test.done();80 });81 },82};83exports['controller.provision'] = {84 setUp(done) {85 this.sandbox = sinon.sandbox.create();86 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');87 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');88 this.warn = this.sandbox.stub(log, 'warn');89 this.info = this.sandbox.stub(log, 'info');90 this.basic = this.sandbox.stub(log, 'basic');91 this.error = this.sandbox.stub(log, 'error');92 this.isProvisioned = this.sandbox.stub(Tessel, 'isProvisioned').returns(true);93 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').returns(Promise.resolve());94 done();95 },96 tearDown(done) {97 this.sandbox.restore();98 done();99 },100 isProvisionedAndOptsNotForced(test) {101 test.expect(1);102 controller.provision({}).then(() => {103 // We only care that this resolves.104 test.ok(true);105 test.done();106 });107 },108};109exports['controller.closeTesselConnections'] = {110 setUp(done) {111 this.sandbox = sinon.sandbox.create();112 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');113 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');114 this.warn = this.sandbox.stub(log, 'warn');115 this.info = this.sandbox.stub(log, 'info');116 this.basic = this.sandbox.stub(log, 'basic');117 this.error = this.sandbox.stub(log, 'error');118 done();119 },120 tearDown(done) {121 this.sandbox.restore();122 done();123 },124 rejectsOnError(test) {125 test.expect(1);126 this.asyncEach = this.sandbox.stub(async, 'each').callsFake((tessels, next, done) => {127 done(new Error('This is only a test'));128 });129 controller.closeTesselConnections([1, 2, 3])130 .catch(error => {131 test.equal(error.toString(), 'Error: This is only a test');132 test.done();133 });134 },135 callsCloseOnAllAuthorizedLANConnections(test) {136 test.expect(3);137 var a = newTessel({138 sandbox: this.sandbox,139 authorized: true,140 connectionType: 'LAN'141 });142 var b = newTessel({143 sandbox: this.sandbox,144 authorized: true,145 connectionType: 'LAN'146 });147 var c = newTessel({148 sandbox: this.sandbox,149 authorized: false,150 connectionType: 'LAN'151 });152 controller.closeTesselConnections([a, b, c])153 .then(() => {154 test.equal(a.close.callCount, 1);155 test.equal(b.close.callCount, 1);156 test.equal(c.close.callCount, 0);157 test.done();158 });159 },160 callsCloseOnAllUSBConnections(test) {161 test.expect(3);162 var a = newTessel({163 sandbox: this.sandbox,164 connectionType: 'USB'165 });166 var b = newTessel({167 sandbox: this.sandbox,168 connectionType: 'USB'169 });170 var c = newTessel({171 sandbox: this.sandbox,172 authorized: true,173 connectionType: 'LAN'174 });175 controller.closeTesselConnections([a, b, c])176 .then(() => {177 test.equal(a.close.callCount, 1);178 test.equal(b.close.callCount, 1);179 test.equal(c.close.callCount, 1);180 test.done();181 });182 },183 resolvesForUnauthorizedLANConnections(test) {184 test.expect(1);185 var a = newTessel({186 sandbox: this.sandbox,187 authorized: false,188 connectionType: 'LAN'189 });190 controller.closeTesselConnections([a])191 .then(() => {192 test.equal(a.close.callCount, 0);193 test.done();194 });195 },196 resolvesForClosedUSBConnections(test) {197 test.expect(1);198 var a = newTessel({199 sandbox: this.sandbox,200 authorized: false,201 connectionType: 'USB'202 });203 a.usbConnection.closed = true;204 controller.closeTesselConnections([a])205 .then(() => {206 test.equal(a.close.callCount, 0);207 test.done();208 });209 },210};211exports['controller.runHeuristics'] = {212 setUp(done) {213 this.sandbox = sinon.sandbox.create();214 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');215 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');216 this.warn = this.sandbox.stub(log, 'warn');217 this.info = this.sandbox.stub(log, 'info');218 this.basic = this.sandbox.stub(log, 'basic');219 this.error = this.sandbox.stub(log, 'error');220 this.processOn = this.sandbox.stub(process, 'on');221 done();222 },223 tearDown(done) {224 this.sandbox.restore();225 done();226 },227 oneUSBDevice(test) {228 test.expect(1);229 var a = newTessel({230 sandbox: this.sandbox,231 authorized: true,232 connectionType: 'USB'233 });234 controller.runHeuristics({}, [a])235 .then(function(tessel) {236 test.deepEqual(a, tessel);237 test.done();238 });239 },240 oneLANDevice(test) {241 test.expect(1);242 var a = newTessel({243 sandbox: this.sandbox,244 authorized: true,245 connectionType: 'LAN'246 });247 controller.runHeuristics({}, [a])248 .then(function(tessel) {249 test.deepEqual(a, tessel);250 test.done();251 });252 },253 USBAndLANDevices(test) {254 test.expect(1);255 var a = newTessel({256 name: 'a',257 sandbox: this.sandbox,258 authorized: true,259 connectionType: 'LAN'260 });261 var b = newTessel({262 name: 'b',263 sandbox: this.sandbox,264 authorized: true,265 connectionType: 'USB'266 });267 controller.runHeuristics({}, [a, b])268 .then(function(tessel) {269 // console.log(tessel);270 test.deepEqual(b, tessel);271 test.done();272 }).catch(error => console.log(error));273 },274 USBAndLANDevicesButNamedDeviceIsLateInList(test) {275 test.expect(1);276 var a = newTessel({277 name: 'a',278 sandbox: this.sandbox,279 authorized: true,280 connectionType: 'LAN'281 });282 var b = newTessel({283 name: 'b',284 sandbox: this.sandbox,285 authorized: true,286 connectionType: 'USB'287 });288 var c = newTessel({289 name: 'c',290 sandbox: this.sandbox,291 authorized: true,292 connectionType: 'USB'293 });294 controller.runHeuristics({name: 'c'}, [a, b, c])295 .then(function(tessel) {296 test.deepEqual(c, tessel);297 test.done();298 }).catch(error => console.log(error));299 },300 bothConnectionsAndLAN(test) {301 test.expect(1);302 var a = newTessel({303 sandbox: this.sandbox,304 authorized: true,305 connectionType: 'LAN'306 });307 var b = newTessel({308 sandbox: this.sandbox,309 authorized: true,310 connectionType: 'USB'311 });312 b.addConnection({313 connectionType: 'LAN',314 authorized: true315 });316 controller.runHeuristics({}, [a, b])317 .then(function(tessel) {318 test.deepEqual(b, tessel);319 test.done();320 });321 },322 bothConnectionsAndMultipleLAN(test) {323 test.expect(1);324 var a = newTessel({325 sandbox: this.sandbox,326 authorized: true,327 connectionType: 'LAN'328 });329 var b = newTessel({330 sandbox: this.sandbox,331 authorized: true,332 connectionType: 'LAN'333 });334 var c = newTessel({335 sandbox: this.sandbox,336 authorized: true,337 connectionType: 'USB'338 });339 c.addConnection({340 connectionType: 'LAN',341 authorized: true342 });343 controller.runHeuristics({}, [a, b, c])344 .then(function(tessel) {345 test.deepEqual(c, tessel);346 test.done();347 }).catch(error => console.log(error));348 },349 USBAndLANDevicesWithNameOption(test) {350 test.expect(1);351 var a = newTessel({352 sandbox: this.sandbox,353 authorized: true,354 connectionType: 'LAN',355 name: 'Me!'356 });357 var b = newTessel({358 sandbox: this.sandbox,359 authorized: true,360 connectionType: 'USB',361 name: 'Not Me!'362 });363 controller.runHeuristics({364 name: a.name365 }, [a, b])366 .then(function(tessel) {367 test.deepEqual(a, tessel);368 test.done();369 });370 },371 USBAndLANDevicesWithEnvVariable(test) {372 test.expect(1);373 const winningName = 'Me!';374 process.env['Tessel'] = winningName;375 const a = newTessel({376 sandbox: this.sandbox,377 authorized: true,378 connectionType: 'LAN'379 });380 a.name = winningName;381 const b = newTessel({382 sandbox: this.sandbox,383 authorized: true,384 connectionType: 'USB'385 });386 b.name = `Not ${winningName}`;387 controller.runHeuristics({388 name: a.name389 }, [a, b])390 .then(tessel => {391 test.deepEqual(a, tessel);392 process.env['Tessel'] = undefined;393 test.done();394 });395 },396 catchAmbiguityTwoLAN(test) {397 test.expect(1);398 var a = newTessel({399 sandbox: this.sandbox,400 authorized: true,401 connectionType: 'LAN'402 });403 var b = newTessel({404 sandbox: this.sandbox,405 authorized: true,406 connectionType: 'LAN'407 });408 controller.runHeuristics({}, [a, b])409 .then(() => {410 test.ok(false, 'Test failed because expected HeuristicAmbiguityError did not occur.');411 test.done();412 })413 .catch(error => {414 test.equal(error instanceof controller.HeuristicAmbiguityError, true);415 test.done();416 });417 },418 catchAmbiguityTwoUSB(test) {419 test.expect(1);420 var a = newTessel({421 sandbox: this.sandbox,422 authorized: true,423 connectionType: 'USB'424 });425 var b = newTessel({426 sandbox: this.sandbox,427 authorized: true,428 connectionType: 'USB'429 });430 controller.runHeuristics({}, [a, b])431 .then(() => {432 test.ok(false, 'Test failed because expected HeuristicAmbiguityError did not occur.');433 test.done();434 })435 .catch(error => {436 test.equal(error instanceof controller.HeuristicAmbiguityError, true);437 test.done();438 });439 }440};441exports['controller.envVersions'] = {442 setUp(done) {443 this.sandbox = sinon.sandbox.create();444 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');445 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');446 this.warn = this.sandbox.stub(log, 'warn');447 this.info = this.sandbox.stub(log, 'info');448 this.basic = this.sandbox.stub(log, 'basic');449 this.error = this.sandbox.stub(log, 'error');450 this.tessel = TesselSimulator({451 name: 'TestTessel'452 });453 this.packageJsonVersion = require('../../package.json').version;454 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {455 return callback(this.tessel);456 });457 this.fetchCurrentBuildInfo = this.sandbox.stub(Tessel.prototype, 'fetchCurrentBuildInfo').callsFake(() => {458 return Promise.resolve('9a85c84f5a03c715908921baaaa9e7397985bc7f');459 });460 this.fetchNodeProcessVersion = this.sandbox.stub(Tessel.prototype, 'fetchNodeProcessVersion').callsFake(() => {461 return Promise.resolve('4.2.1');462 });463 this.requestBuildList = this.sandbox.stub(updates, 'requestBuildList').callsFake(() => {464 return Promise.resolve(465 [{466 'released': '2015-08-20T16:20:08.704Z',467 'sha': '78f2bd20af9eaf76796657186f3010f03a979dc8',468 'version': '0.0.3',469 }, {470 'released': '2015-08-18T15:12:13.070Z',471 'sha': 'bf327359b4a13b4da07bc5776fe8a22ae88d54f9',472 'version': '0.0.2',473 }, {474 'released': '2015-08-12T03:01:57.856Z',475 'sha': '9a85c84f5a03c715908921baaaa9e7397985bc7f',476 'version': '0.0.1',477 }]478 );479 });480 done();481 },482 tearDown(done) {483 this.tessel.mockClose();484 this.sandbox.restore();485 done();486 },487 properVersionsReturned(test) {488 test.expect(8);489 var opts = {};490 controller.envVersions(opts)491 .then(() => {492 // Version command was sent493 test.equal(this.standardTesselCommand.callCount, 1);494 // Get the firmware version495 test.equal(this.fetchCurrentBuildInfo.callCount, 1);496 // Execute `node --version` command on tessel497 test.equal(this.fetchNodeProcessVersion.callCount, 1);498 // Make sure we have some output499 test.equal(this.info.callCount, 4);500 test.equal(this.info.getCall(0).args[0], `Tessel Environment Versions:`);501 // Output of CLI version to console502 test.equal(this.info.getCall(1).args[0], `t2-cli: ${this.packageJsonVersion}`);503 // Output of firmware version to console504 test.equal(this.info.getCall(2).args[0], 't2-firmware: 0.0.1');505 // Output of Node version to console506 test.equal(this.info.getCall(3).args[0], 'Node.js: 4.2.1');507 test.done();508 });509 },510 requestVersionWithoutTessel(test) {511 test.expect(7);512 const message = 'No Tessels Found.';513 this.standardTesselCommand.restore();514 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake(() => {515 return Promise.reject(message);516 });517 const opts = {};518 controller.envVersions(opts)519 .then(() => {520 // Version command was sent521 test.equal(this.standardTesselCommand.callCount, 1);522 test.equal(this.fetchCurrentBuildInfo.callCount, 0);523 test.equal(this.fetchNodeProcessVersion.callCount, 0);524 // Make sure we have some output525 test.equal(this.info.callCount, 3);526 test.equal(this.info.getCall(0).args[0], `Tessel Environment Versions:`);527 // Output of CLI version to console528 test.equal(this.info.getCall(1).args[0], `t2-cli: ${this.packageJsonVersion}`);529 // Output 'No Tessels Found' message530 test.equal(this.info.getCall(2).args[0], message);531 test.done();532 })533 .catch(() => {534 test.ok(false, 'envVersions was expected to succeed');535 test.done();536 });537 },538 requestVersionsFailure(test) {539 test.expect(1);540 this.fetchCurrentBuildInfo.restore();541 this.fetchCurrentBuildInfo = this.sandbox.stub(this.tessel, 'fetchCurrentBuildInfo').callsFake(() => {542 throw new Error();543 });544 var opts = {};545 controller.envVersions(opts)546 .then(() => {547 test.ok(false, 'envVersions was expected to fail');548 test.done();549 })550 .catch(() => {551 test.ok(true);552 test.done();553 });554 },555 // This happens with development builds.556 noBuildVersionExistsForThisSha(test) {557 test.expect(1);558 const sha = '59ce9c97e275e6e970c1ee668e5591514eb1cd74';559 this.fetchCurrentBuildInfo.restore();560 this.sandbox.stub(this.tessel, 'fetchCurrentBuildInfo').callsFake(() => Promise.resolve(sha));561 var opts = {};562 controller.envVersions(opts)563 .then(() => {564 test.equal(this.info.getCall(2).args[0], `t2-firmware: ${sha}`);565 test.done();566 })567 .catch(() => {568 test.ok(false);569 test.done();570 });571 },572};573exports['Tessel.list'] = {574 setUp(done) {575 var testContext = this;576 this.sandbox = sinon.sandbox.create();577 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');578 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');579 this.warn = this.sandbox.stub(log, 'warn');580 this.info = this.sandbox.stub(log, 'info');581 this.basic = this.sandbox.stub(log, 'basic');582 this.error = this.sandbox.stub(log, 'error');583 this.processOn = this.sandbox.stub(process, 'on');584 this.activeSeeker = undefined;585 this.seeker = this.sandbox.stub(discover, 'TesselSeeker').callsFake(function() {586 testContext.activeSeeker = this;587 this.start = (opts) => {588 if (opts.timeout && typeof opts.timeout === 'number') {589 setTimeout(this.stop, opts.timeout);590 }591 return this;592 };593 this.stop = () => {594 this.emit('end');595 return this;596 };597 });598 util.inherits(this.seeker, Emitter);599 this.closeTesselConnections = this.sandbox.spy(controller, 'closeTesselConnections');600 this.runHeuristics = this.sandbox.spy(controller, 'runHeuristics');601 this.standardOpts = {602 timeout: 0.01,603 };604 done();605 },606 tearDown(done) {607 this.sandbox.restore();608 done();609 },610 oneUSBTessel(test) {611 test.expect(4);612 var a = newTessel({613 sandbox: this.sandbox,614 authorized: true,615 connectionType: 'USB'616 });617 Tessel.list(this.standardOpts)618 .then(() => {619 test.equal(this.runHeuristics.callCount, 0);620 test.equal(this.closeTesselConnections.callCount, 1);621 test.equal(a.close.callCount, 1);622 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);623 test.done();624 });625 // We must emit the Tessel sometime after list is called626 // but before the seeker stops searching627 setImmediate(() => {628 this.activeSeeker.emit('tessel', a);629 });630 },631 oneLANTessel(test) {632 test.expect(4);633 var a = newTessel({634 sandbox: this.sandbox,635 authorized: true,636 connectionType: 'LAN'637 });638 Tessel.list(this.standardOpts)639 .then(() => {640 test.equal(this.runHeuristics.callCount, 0);641 test.equal(this.closeTesselConnections.callCount, 1);642 test.equal(a.close.callCount, 1);643 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);644 test.done();645 });646 // We must emit the Tessel sometime after list is called647 // but before the seeker stops searching648 setImmediate(() => {649 this.activeSeeker.emit('tessel', a);650 });651 },652 explicitlyOnlyReportAuthorizedTessel(test) {653 test.expect(4);654 var a = newTessel({655 sandbox: this.sandbox,656 authorized: false,657 connectionType: 'LAN'658 });659 var customOpts = Object.assign({}, this.standardOpts, {660 authorized: true661 });662 Tessel.list(customOpts)663 .then(() => {664 test.equal(this.runHeuristics.callCount, 0);665 test.equal(this.closeTesselConnections.callCount, 1);666 // "a" will not be closed, because it will never be opened.667 test.equal(a.close.callCount, 0);668 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);669 test.done();670 }).catch(error => {671 console.log(error);672 });673 this.activeSeeker.emit('tessel', a);674 this.activeSeeker.emit('end');675 },676 explicitlyOnlyReportAuthorizedTesselNoneFound(test) {677 test.expect(1);678 this.standardOpts.authorized = true;679 Tessel.list(this.standardOpts)680 .then(() => {681 test.ok(false, 'This should not be successful');682 test.done();683 }).catch(error => {684 test.equal(error.toString(), 'No Authorized Tessels Found.');685 test.done();686 });687 this.activeSeeker.emit('end');688 },689 oneTesselTwoConnections(test) {690 test.expect(5);691 var usb = newTessel({692 sandbox: this.sandbox,693 connectionType: 'USB',694 name: 'samesies'695 });696 var lan = newTessel({697 sandbox: this.sandbox,698 authorized: true,699 connectionType: 'LAN',700 name: 'samesies'701 });702 Tessel.list(this.standardOpts)703 .then(() => {704 test.equal(this.runHeuristics.callCount, 0);705 test.equal(this.closeTesselConnections.callCount, 1);706 test.equal(usb.close.callCount, 1);707 test.equal(lan.close.callCount, 1);708 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);709 test.done();710 });711 // We must emit the Tessel sometime after list is called712 // but before the seeker stops searching713 setImmediate(() => {714 this.activeSeeker.emit('tessel', usb);715 this.activeSeeker.emit('tessel', lan);716 });717 },718 multipleDifferentTessels(test) {719 test.expect(5);720 var usb = newTessel({721 sandbox: this.sandbox,722 connectionType: 'USB',723 name: 'foo'724 });725 var lan = newTessel({726 sandbox: this.sandbox,727 authorized: true,728 connectionType: 'LAN',729 name: 'bar'730 });731 Tessel.list(this.standardOpts)732 .then(() => {733 test.equal(this.runHeuristics.callCount, 1);734 test.equal(this.closeTesselConnections.callCount, 1);735 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);736 test.equal(usb.close.callCount, 1);737 test.equal(lan.close.callCount, 1);738 test.done();739 });740 // We must emit the Tessel sometime after list is called741 // but before the seeker stops searching742 setImmediate(() => {743 this.activeSeeker.emit('tessel', usb);744 this.activeSeeker.emit('tessel', lan);745 });746 },747 runHeuristicsRejection(test) {748 test.expect(1);749 this.runHeuristics.restore();750 this.closeTesselConnections.restore();751 this.runHeuristics = this.sandbox.stub(controller, 'runHeuristics').returns(Promise.reject(new Error('Bogus error')));752 this.closeTesselConnections = this.sandbox.stub(controller, 'closeTesselConnections').returns(Promise.resolve());753 var usb = newTessel({754 sandbox: this.sandbox,755 connectionType: 'USB',756 name: 'foo'757 });758 var lan = newTessel({759 sandbox: this.sandbox,760 authorized: true,761 connectionType: 'LAN',762 name: 'bar'763 });764 Tessel.list(this.standardOpts)765 .catch(error => {766 test.equal(error.toString(), 'Error: Bogus error');767 }).then(() => {768 usb.mockClose();769 lan.mockClose();770 test.done();771 });772 // Make sure the multiple tessel path is taken773 this.activeSeeker.emit('tessel', usb);774 this.activeSeeker.emit('tessel', lan);775 this.activeSeeker.emit('end');776 },777};778exports['Tessel.get'] = {779 setUp(done) {780 var testContext = this;781 this.sandbox = sinon.sandbox.create();782 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');783 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');784 this.warn = this.sandbox.stub(log, 'warn');785 this.info = this.sandbox.stub(log, 'info');786 this.basic = this.sandbox.stub(log, 'basic');787 this.error = this.sandbox.stub(log, 'error');788 this.processOn = this.sandbox.stub(process, 'on');789 this.activeSeeker = undefined;790 this.seeker = this.sandbox.stub(discover, 'TesselSeeker').callsFake(function Seeker() {791 this.start = (opts) => {792 testContext.activeSeeker = this;793 testContext.sandbox.spy(this, 'removeAllListeners');794 this.msg = {795 noAuth: 'No Authorized Tessels Found.',796 auth: 'No Tessels Found.'797 };798 if (opts.timeout && typeof opts.timeout === 'number') {799 setTimeout(this.stop, opts.timeout);800 }801 return this;802 };803 this.stop = () => {804 testContext.activeSeeker.emit('end');805 return this;806 };807 });808 util.inherits(this.seeker, Emitter);809 this.closeTesselConnections = this.sandbox.stub(controller, 'closeTesselConnections');810 this.reconcileTessels = this.sandbox.spy(controller, 'reconcileTessels');811 this.runHeuristics = this.sandbox.spy(controller, 'runHeuristics');812 this.standardOpts = {813 timeout: 0.01,814 };815 done();816 },817 tearDown(done) {818 this.sandbox.restore();819 done();820 },821 fallbackTimeout(test) {822 test.expect(7);823 controller.closeTesselConnections.returns(Promise.resolve());824 var a = newTessel({825 sandbox: this.sandbox,826 authorized: true,827 connectionType: 'LAN',828 name: 'the_name'829 });830 var customOpts = {831 key: this.standardOpts.key,832 name: 'the_name',833 timeout: 0,834 };835 Tessel.get(customOpts)836 .then(() => {837 test.equal(this.activeSeeker.removeAllListeners.callCount, 1);838 test.equal(this.reconcileTessels.callCount, 0);839 test.equal(this.runHeuristics.callCount, 0);840 test.equal(this.closeTesselConnections.callCount, 1);841 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);842 test.equal(this.info.callCount, 2);843 test.equal(this.info.lastCall.args[0].includes('the_name'), true);844 test.done();845 });846 // We must emit the Tessel sometime after list is called847 // but before the seeker stops searching848 setImmediate(() => {849 this.activeSeeker.emit('tessel', a);850 });851 },852 oneNamedTessel(test) {853 test.expect(7);854 controller.closeTesselConnections.returns(Promise.resolve());855 var a = newTessel({856 sandbox: this.sandbox,857 authorized: true,858 connectionType: 'LAN',859 name: 'the_name'860 });861 var customOpts = {862 timeout: this.standardOpts.timeout,863 key: this.standardOpts.key,864 name: 'the_name'865 };866 Tessel.get(customOpts)867 .then(() => {868 test.equal(this.activeSeeker.removeAllListeners.callCount, 1);869 test.equal(this.reconcileTessels.callCount, 0);870 test.equal(this.runHeuristics.callCount, 0);871 test.equal(this.closeTesselConnections.callCount, 1);872 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);873 test.equal(this.info.callCount, 2);874 test.equal(this.info.lastCall.args[0].includes('the_name'), true);875 test.done();876 });877 // We must emit the Tessel sometime after list is called878 // but before the seeker stops searching879 setImmediate(() => {880 this.activeSeeker.emit('tessel', a);881 });882 },883 oneUnNamedTessel(test) {884 test.expect(7);885 controller.closeTesselConnections.returns(Promise.resolve());886 var a = newTessel({887 sandbox: this.sandbox,888 authorized: true,889 connectionType: 'LAN',890 name: 'the_name'891 });892 Tessel.get(this.standardOpts)893 .then(() => {894 test.equal(this.activeSeeker.removeAllListeners.callCount, 0);895 test.equal(this.reconcileTessels.callCount, 0);896 test.equal(this.runHeuristics.callCount, 0);897 test.equal(this.closeTesselConnections.callCount, 1);898 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);899 test.equal(this.info.callCount, 2);900 test.equal(this.info.lastCall.args[0].includes('the_name'), true);901 test.done();902 });903 // We must emit the Tessel sometime after list is called904 // but before the seeker stops searching905 setImmediate(() => {906 this.activeSeeker.emit('tessel', a);907 });908 },909 logAndFinishSpecificTessel(test) {910 test.expect(2);911 controller.closeTesselConnections.returns(Promise.resolve());912 this.menuPrompt = this.sandbox.stub(Menu, 'prompt').callsFake((prompt) => {913 var value = prompt.translate('\tUSB\ta\t');914 return Promise.resolve(value);915 });916 var a = newTessel({917 sandbox: this.sandbox,918 authorized: true,919 connectionType: 'LAN',920 name: 'a'921 });922 var b = newTessel({923 sandbox: this.sandbox,924 authorized: true,925 connectionType: 'LAN',926 name: 'b'927 });928 var customOpts = Object.assign({}, this.standardOpts, {929 name: 'a'930 });931 Tessel.get(customOpts)932 .then(() => {933 a.mockClose();934 b.mockClose();935 test.equal(this.activeSeeker.removeAllListeners.callCount, 1);936 test.equal(this.info.callCount, 2);937 test.done();938 });939 // We must emit the Tessel sometime after list is called940 // but before the seeker stops searching941 this.activeSeeker.emit('tessel', a);942 this.activeSeeker.emit('tessel', b);943 this.activeSeeker.emit('end');944 },945 oneUnamedTesselTwoConnections(test) {946 test.expect(7);947 controller.closeTesselConnections.returns(Promise.resolve());948 var usb = newTessel({949 sandbox: this.sandbox,950 connectionType: 'USB',951 name: 'samesies'952 });953 var lan = newTessel({954 sandbox: this.sandbox,955 authorized: true,956 connectionType: 'LAN',957 name: 'samesies'958 });959 var customOpts = this.standardOpts;960 customOpts.lanPrefer = true;961 Tessel.get(customOpts)962 .then(() => {963 test.equal(this.activeSeeker.removeAllListeners.callCount, 0);964 test.equal(this.reconcileTessels.callCount, 1);965 test.equal(this.runHeuristics.callCount, 1);966 test.equal(this.closeTesselConnections.callCount, 1);967 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);968 test.equal(this.info.callCount, 2);969 test.equal(this.info.lastCall.args[0].includes('samesies'), true);970 test.done();971 });972 // We must emit the Tessel sometime after list is called973 // but before the seeker stops searching974 setImmediate(() => {975 this.activeSeeker.emit('tessel', usb);976 this.activeSeeker.emit('tessel', lan);977 });978 },979 twoDifferentTesselsPickOne(test) {980 test.expect(6);981 controller.closeTesselConnections.returns(Promise.resolve());982 this.runHeuristics.restore();983 this.runHeuristics = this.sandbox.stub(controller, 'runHeuristics').callsFake(() => {984 return Promise.reject(new controller.HeuristicAmbiguityError('Bogus error'));985 });986 this.menuPrompt = this.sandbox.stub(Menu, 'prompt').callsFake((prompt) => {987 var value = prompt.translate('\tUSB\ta\t');988 return Promise.resolve(value);989 });990 var usb = newTessel({991 sandbox: this.sandbox,992 connectionType: 'USB',993 name: 'a'994 });995 var lan = newTessel({996 sandbox: this.sandbox,997 authorized: true,998 connectionType: 'LAN',999 name: 'a'1000 });1001 var customOpts = this.standardOpts;1002 Tessel.get(customOpts)1003 .catch(() => {1004 test.equal(this.activeSeeker.removeAllListeners.callCount, 0);1005 test.equal(this.reconcileTessels.callCount, 1);1006 test.equal(this.runHeuristics.callCount, 1);1007 test.equal(this.closeTesselConnections.callCount, 1);1008 test.equal(Array.isArray(this.closeTesselConnections.args[0]), true);1009 test.equal(this.info.callCount, 1);1010 test.done();1011 });1012 this.activeSeeker.emit('tessel', usb);1013 this.activeSeeker.emit('tessel', lan);1014 this.activeSeeker.emit('end');1015 },1016 standardCommandNoTessels(test) {1017 test.expect(3);1018 controller.standardTesselCommand(this.standardOpts, function() {1019 // Doesn't matter what this function does b/c Tessel.get will fail1020 return Promise.resolve();1021 })1022 .catch(error => {1023 test.equal(controller.tessel, null);1024 // We don't need to close any connections because none were found1025 test.equal(this.closeTesselConnections.callCount, 0);1026 test.equal(typeof error, 'string');1027 test.done();1028 });1029 },1030 standardCommandSuccess(test) {1031 test.expect(5);1032 controller.closeTesselConnections.returns(Promise.resolve());1033 var optionalValue = 'testValue';1034 controller.standardTesselCommand(this.standardOpts, tessel => {1035 // Make sure we have been given the tessel that was emitted1036 test.deepEqual(tessel, usb);1037 // The active tessel is available at controller.tessel1038 test.equal(controller.tessel, usb);1039 // Finish the command1040 return Promise.resolve(optionalValue);1041 })1042 .then(returnedValue => {1043 // We need to close the connection of the Tessel we found1044 // We close once at the end of Tessel.get and again after the standard command1045 test.equal(this.closeTesselConnections.callCount, 2);1046 // Make sure we closed the connection of the exact Tessel we emitted1047 test.equal(this.closeTesselConnections.args[1][0][0], usb);1048 // Ensure we got the optional returned value1049 test.equal(optionalValue, returnedValue);1050 test.done();1051 })1052 .catch(error => {1053 test.ok(false, error.toString());1054 test.done();1055 });1056 var usb = newTessel({1057 sandbox: this.sandbox,1058 connectionType: 'USB',1059 name: 'USBTessel'1060 });1061 // We must emit the Tessel sometime after list is called1062 // but before the seeker stops searching1063 setImmediate(() => {1064 this.activeSeeker.emit('tessel', usb);1065 });1066 },1067 standardCommandFailed(test) {1068 test.expect(4);1069 controller.closeTesselConnections.returns(Promise.resolve());1070 var errMessage = 'This command failed';1071 controller.standardTesselCommand(this.standardOpts, function(tessel) {1072 // Make sure we have been given the tessel that was emitted1073 test.deepEqual(tessel, usb);1074 // Finish the command1075 return Promise.reject(errMessage);1076 })1077 .then(() => {1078 test.ok(false, 'standardTesselCommand was expected to fail, but did not.');1079 test.done();1080 })1081 .catch(error => {1082 // Make sure the error messages are passed through properly1083 test.equal(errMessage, error);1084 // We need to close the connection of the Tessel we found1085 // We close once at the end of Tessel.get and again after the standard command1086 test.equal(this.closeTesselConnections.callCount, 2);1087 // Make sure we closed the connection of the exact Tessel we emitted1088 test.equal(this.closeTesselConnections.args[1][0][0], usb);1089 test.done();1090 });1091 var usb = newTessel({1092 sandbox: this.sandbox,1093 connectionType: 'USB',1094 name: 'USBTessel'1095 });1096 // We must emit the Tessel sometime after list is called1097 // but before the seeker stops searching1098 setImmediate(() => {1099 this.activeSeeker.emit('tessel', usb);1100 });1101 },1102 standardCommandSigInt(test) {1103 test.expect(2);1104 controller.closeTesselConnections.returns(Promise.resolve());1105 controller.standardTesselCommand(this.standardOpts, function() {1106 // This command doesn't do anything. It won't resolve so if we do get1107 // to the next clause, it's due to the sigint1108 })1109 .then(() => {1110 // We need to close the connection of the Tessel we found1111 // We close once at the end of Tessel.get and again after the standard command1112 test.equal(this.closeTesselConnections.callCount, 2);1113 // Make sure we closed the connection of the exact Tessel we emitted1114 test.equal(this.closeTesselConnections.args[1][0][0], usb);1115 test.done();1116 })1117 .catch(error => {1118 test.ok(false, error.toString());1119 test.done();1120 });1121 var usb = newTessel({1122 sandbox: this.sandbox,1123 connectionType: 'USB',1124 name: 'USBTessel'1125 });1126 // We must emit the Tessel sometime after list is called1127 // but before the seeker stops searching1128 setImmediate(() => {1129 this.activeSeeker.emit('tessel', usb);1130 process.emit('SIGINT');1131 });1132 },1133};1134exports['controller.createAccessPoint'] = {1135 setUp(done) {1136 this.sandbox = sinon.sandbox.create();1137 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1138 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1139 this.warn = this.sandbox.stub(log, 'warn');1140 this.info = this.sandbox.stub(log, 'info');1141 this.basic = this.sandbox.stub(log, 'basic');1142 this.error = this.sandbox.stub(log, 'error');1143 // stub this command to avoid authoized Tessel validation1144 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').returns(Promise.resolve(true));1145 done();1146 },1147 tearDown(done) {1148 this.sandbox.restore();1149 done();1150 },1151 noNetworkSSID(test) {1152 test.expect(1);1153 controller.connectToNetwork({1154 ssid: undefined1155 })1156 .catch(error => {1157 test.ok(error);1158 test.done();1159 });1160 },1161 noNetworkPasswordWithSecurity(test) {1162 test.expect(1);1163 controller.connectToNetwork({1164 ssid: 'test',1165 password: undefined,1166 security: 'psk2'1167 })1168 .catch(error => {1169 test.ok(error);1170 test.done();1171 });1172 },1173 invalidNetworkSecurityOption(test) {1174 test.expect(1);1175 controller.connectToNetwork({1176 ssid: 'test',1177 password: undefined,1178 security: 'reallySecure'1179 })1180 .catch(error => {1181 test.ok(error);1182 test.done();1183 });1184 },1185 noAccessPointSSID(test) {1186 test.expect(1);1187 controller.createAccessPoint({1188 ssid: undefined1189 })1190 .catch(error => {1191 test.ok(error);1192 test.done();1193 });1194 },1195 noAccessPointPasswordWithSecurity(test) {1196 test.expect(1);1197 controller.createAccessPoint({1198 ssid: 'test',1199 password: undefined,1200 security: 'psk2'1201 })1202 .catch(error => {1203 test.ok(error);1204 test.done();1205 });1206 },1207 invalidAccessPointSecurityOption(test) {1208 test.expect(1);1209 controller.createAccessPoint({1210 ssid: 'test',1211 password: undefined,1212 security: 'reallySecure'1213 })1214 .catch(error => {1215 test.ok(true, error.toString());1216 test.done();1217 });1218 },1219 invalidAccessPointWEPPasswordCharacters(test) {1220 test.expect(1);1221 controller.createAccessPoint({1222 ssid: 'test',1223 password: 'nothexdigits',1224 security: 'wep'1225 })1226 .catch(error => {1227 test.ok(error);1228 test.done();1229 });1230 },1231 invalidAccessPointWEPPasswordLength(test) {1232 test.expect(1);1233 controller.createAccessPoint({1234 ssid: 'test',1235 password: '0123456789ABCDEF',1236 security: 'wep'1237 })1238 .catch(error => {1239 test.ok(error);1240 test.done();1241 });1242 },1243 validAccessPointWEPPassword(test) {1244 test.expect(1);1245 controller.createAccessPoint({1246 ssid: 'test',1247 password: '01234ABCDE',1248 security: 'wep'1249 })1250 .then((settings) => {1251 test.ok(settings);1252 test.done();1253 })1254 .catch(error => {1255 test.fail(error.toString());1256 test.done();1257 });1258 },1259 invalidAccessPointPSKPasswordCharacters(test) {1260 test.expect(1);1261 controller.createAccessPoint({1262 ssid: 'test',1263 password: 'Password™',1264 security: 'psk'1265 })1266 .catch(error => {1267 test.ok(error);1268 test.done();1269 });1270 },1271 invalidAccessPointPSKASCIIPasswordTooShort(test) {1272 test.expect(1);1273 controller.createAccessPoint({1274 ssid: 'test',1275 password: 'short',1276 security: 'psk'1277 })1278 .catch(error => {1279 test.ok(error);1280 test.done();1281 });1282 },1283 invalidAccessPointPSKASCIIPasswordTooLong(test) {1284 test.expect(1);1285 controller.createAccessPoint({1286 ssid: 'test',1287 password: 'this is a very long passphrase. in fact, it is over 63 characters, which makes it invalid.',1288 security: 'psk'1289 })1290 .catch(error => {1291 test.ok(error);1292 test.done();1293 });1294 },1295 invalidAccessPointPSKHexPasswordTooShort(test) {1296 test.expect(1);1297 controller.createAccessPoint({1298 ssid: 'test',1299 password: 'DEAD',1300 security: 'psk'1301 })1302 .catch(error => {1303 test.ok(error);1304 test.done();1305 });1306 },1307 invalidAccessPointPSKHexPasswordTooLong(test) {1308 test.expect(1);1309 controller.createAccessPoint({1310 ssid: 'test',1311 password: 'DEADDEADDEADDEADDEADDEADDEADDEADDEADDEADDEADDEADDEADDEADDEADDEADDEAD',1312 security: 'psk'1313 })1314 .catch(error => {1315 test.ok(error);1316 test.done();1317 });1318 },1319 validAccessPointPSKPassword(test) {1320 test.expect(1);1321 controller.createAccessPoint({1322 ssid: 'test',1323 password: 'ValidPassword!',1324 security: 'psk'1325 })1326 .then((settings) => {1327 test.ok(settings);1328 test.done();1329 })1330 .catch((error) => {1331 test.fail(error.toString());1332 test.done();1333 });1334 },1335};1336exports['controller.getWifiInfo'] = {1337 setUp(done) {1338 this.sandbox = sinon.sandbox.create();1339 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1340 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1341 this.warn = this.sandbox.stub(log, 'warn');1342 this.info = this.sandbox.stub(log, 'info');1343 this.basic = this.sandbox.stub(log, 'basic');1344 this.error = this.sandbox.stub(log, 'error');1345 // stub this command to avoid authoized Tessel validation1346 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').returns(Promise.resolve(true));1347 this.lanbot = newTessel({1348 sandbox: this.sandbox,1349 authorized: true,1350 connectionType: 'LAN',1351 name: 'lanbot'1352 });1353 done();1354 },1355 tearDown(done) {1356 this.sandbox.restore();1357 done();1358 },1359 requestNetworkInfo(test) {1360 test.expect(5);1361 const options = {};1362 controller.standardTesselCommand.restore();1363 this.sandbox.stub(controller, 'standardTesselCommand').callsFake(1364 (options, callback) => callback(this.lanbot)1365 );1366 this.sandbox.stub(this.lanbot, 'getWifiInfo').returns(1367 Promise.resolve(global.networkInfo)1368 );1369 controller.getWifiInfo(options)1370 .then(() => {1371 test.equal(this.info.callCount, 4);1372 test.equal(this.info.getCall(0).args[0], 'SSID: skynet');1373 test.equal(this.info.getCall(1).args[0], 'IP Address: 000.000.000.000');1374 test.equal(this.info.getCall(2).args[0], 'Signal Strength: (70/70)');1375 test.equal(this.info.getCall(3).args[0], 'Bitrate: 22 Mbps');1376 test.done();1377 });1378 },1379};1380exports['controller.root'] = {1381 setUp(done) {1382 this.sandbox = sinon.sandbox.create();1383 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1384 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1385 this.warn = this.sandbox.stub(log, 'warn');1386 this.info = this.sandbox.stub(log, 'info');1387 this.basic = this.sandbox.stub(log, 'basic');1388 this.error = this.sandbox.stub(log, 'error');1389 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').returns(Promise.resolve());1390 function FakeChild() {}1391 FakeChild.prototype = Object.create(Emitter.prototype);1392 this.child = new FakeChild();1393 this.spawn = this.sandbox.stub(cp, 'spawn').callsFake(() => this.child);1394 done();1395 },1396 tearDown(done) {1397 this.sandbox.restore();1398 done();1399 },1400 setsOptsLanTrue(test) {1401 test.expect(3);1402 var opts = {};1403 controller.root(opts)1404 .then(() => {1405 var options = this.standardTesselCommand.lastCall.args[0];1406 test.equal(this.standardTesselCommand.callCount, 1);1407 test.equal(options, opts);1408 test.equal(options.lan, true);1409 test.done();1410 });1411 },1412 setsOptsUsbFalseAndWarns(test) {1413 test.expect(4);1414 var opts = {1415 usb: true1416 };1417 this.warn.restore();1418 this.warn = this.sandbox.stub(log, 'warn');1419 controller.root(opts)1420 .then(() => {1421 var options = this.standardTesselCommand.lastCall.args[0];1422 test.equal(this.standardTesselCommand.callCount, 1);1423 test.equal(options, opts);1424 test.equal(options.usb, false);1425 test.equal(this.warn.callCount, 2);1426 test.done();1427 });1428 },1429 setsAuthorizedTrue(test) {1430 test.expect(3);1431 var opts = {};1432 controller.root(opts)1433 .then(() => {1434 var options = this.standardTesselCommand.lastCall.args[0];1435 test.equal(this.standardTesselCommand.callCount, 1);1436 test.equal(options, opts);1437 test.equal(options.authorized, true);1438 test.done();1439 });1440 },1441 openShell(test) {1442 test.expect(6);1443 var sandbox = this.sandbox;1444 var tessel = newTessel({1445 authorized: true,1446 sandbox: sandbox,1447 connectionType: 'LAN',1448 });1449 var testIP = '192.1.1.1';1450 tessel.lanConnection.ip = testIP;1451 var testKey = '~/fake';1452 this.standardTesselCommand.restore();1453 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1454 return callback(tessel);1455 });1456 // Return our own local auth key (it won't be set because we have stubbed1457 // that functionality out of standardTesselCommand)1458 // this.sandbox.stub(Tessel, 'LOCAL_AUTH_KEY').callsFake(testKey);1459 var opd = Object.getOwnPropertyDescriptor(Tessel, 'LOCAL_AUTH_KEY');1460 Object.defineProperty(Tessel, 'LOCAL_AUTH_KEY', {1461 get() {1462 return testKey;1463 }1464 });1465 controller.root({1466 key: testKey1467 })1468 .then(() => {1469 // Only spawn one process1470 test.ok(this.spawn.calledOnce);1471 // That process is ssh1472 test.equal(this.spawn.firstCall.args[0], 'ssh');1473 // We want to make sure we provide a key path1474 test.equal(this.spawn.firstCall.args[1][0], '-i');1475 // Make sure it's the optional key we provided1476 test.equal(this.spawn.firstCall.args[1][1], testKey);1477 // Make sure it's using the correct IP address1478 test.equal(this.spawn.firstCall.args[1][2], 'root@' + testIP);1479 // We want to ensure stdio streams are piped to the console1480 test.equal(this.spawn.firstCall.args[2].stdio, 'inherit');1481 Object.defineProperty(Tessel, 'LOCAL_AUTH_KEY', opd);1482 test.done();1483 });1484 setImmediate(() => {1485 this.child.emit('close');1486 });1487 },1488 shellOpenError(test) {1489 test.expect(1);1490 var sandbox = this.sandbox;1491 var tessel = newTessel({1492 authorized: true,1493 sandbox: sandbox,1494 connectionType: 'LAN',1495 });1496 this.standardTesselCommand.restore();1497 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1498 return callback(tessel);1499 });1500 var errMessage = 'Your child is a fake!';1501 controller.root({})1502 .then(() => {1503 // Only spawn one process1504 test.ok(false, 'Should have rejected the root promise.');1505 test.done();1506 })1507 .catch(error => {1508 test.ok(error.includes(errMessage));1509 test.done();1510 });1511 setImmediate(() => {1512 this.child.emit('error', new Error(errMessage));1513 });1514 }1515};1516exports['controller.printAvailableNetworks'] = {1517 setUp(done) {1518 this.sandbox = sinon.sandbox.create();1519 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1520 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1521 this.warn = this.sandbox.stub(log, 'warn');1522 this.info = this.sandbox.stub(log, 'info');1523 this.basic = this.sandbox.stub(log, 'basic');1524 this.error = this.sandbox.stub(log, 'error');1525 this.tessel = TesselSimulator();1526 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1527 callback(this.tessel);1528 return Promise.resolve(this.tessel);1529 });1530 this.tessel.name = 'robocop';1531 colors.enabled = false;1532 done();1533 },1534 tearDown(done) {1535 this.tessel.mockClose();1536 this.sandbox.restore();1537 colors.enabled = true;1538 done();1539 },1540 listCountOfVisibleToTesselSingle(test) {1541 test.expect(5);1542 this.findAvailableNetworks = this.sandbox.stub(this.tessel, 'findAvailableNetworks').callsFake(() => {1543 return Promise.resolve([{1544 ssid: 'foo',1545 quality: '100/100'1546 }]);1547 });1548 controller.printAvailableNetworks({})1549 .then(() => {1550 test.equal(this.info.callCount, 2);1551 test.equal(this.basic.callCount, 1);1552 test.equal(this.info.firstCall.args[0], 'Scanning for visible networks...');1553 test.equal(this.info.lastCall.args[0], 'Found 1 network visible to robocop:');1554 test.equal(this.basic.lastCall.args[0], '\tfoo (100/100)');1555 test.done();1556 })1557 .catch(error => {1558 test.ok(false, error.toString());1559 test.done();1560 });1561 },1562 listCountOfVisibleToTesselPlural(test) {1563 test.expect(6);1564 this.findAvailableNetworks = this.sandbox.stub(this.tessel, 'findAvailableNetworks').callsFake(() => {1565 return Promise.resolve([{1566 ssid: 'foo',1567 quality: '100/100'1568 }, {1569 ssid: 'bar',1570 quality: '100/100'1571 }]);1572 });1573 controller.printAvailableNetworks({})1574 .then(() => {1575 test.equal(this.info.callCount, 2);1576 test.equal(this.basic.callCount, 2);1577 test.equal(this.info.firstCall.args[0], 'Scanning for visible networks...');1578 test.equal(this.info.lastCall.args[0], 'Found 2 networks visible to robocop:');1579 test.equal(this.basic.firstCall.args[0], '\tfoo (100/100)');1580 test.equal(this.basic.lastCall.args[0], '\tbar (100/100)');1581 test.done();1582 })1583 .catch(error => {1584 test.ok(false, error.toString());1585 test.done();1586 });1587 },1588 listCountOfVisibleToTesselPluralZero(test) {1589 test.expect(4);1590 this.findAvailableNetworks = this.sandbox.stub(this.tessel, 'findAvailableNetworks').callsFake(() => {1591 return Promise.resolve([]);1592 });1593 controller.printAvailableNetworks({})1594 .then(() => {1595 test.equal(this.info.callCount, 2);1596 test.equal(this.basic.callCount, 0);1597 test.equal(this.info.firstCall.args[0], 'Scanning for visible networks...');1598 test.equal(this.info.lastCall.args[0], 'Found 0 networks visible to robocop:');1599 test.done();1600 })1601 .catch(error => {1602 test.ok(false, error.toString());1603 test.done();1604 });1605 },1606};1607exports['controller.uninstaller'] = {1608 setUp(done) {1609 this.sandbox = sinon.sandbox.create();1610 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1611 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1612 this.warn = this.sandbox.stub(log, 'warn');1613 this.info = this.sandbox.stub(log, 'info');1614 this.basic = this.sandbox.stub(log, 'basic');1615 this.error = this.sandbox.stub(log, 'error');1616 this.homedir = this.sandbox.stub(installer, 'homedir').returns(Promise.resolve());1617 done();1618 },1619 tearDown(done) {1620 this.sandbox.restore();1621 done();1622 },1623 optionsOperationCallThrough(test) {1624 test.expect(1);1625 controller.uninstaller({1626 operation: 'homedir'1627 })1628 .then(() => {1629 test.equal(this.homedir.callCount, 1);1630 test.done();1631 });1632 },1633};1634exports['controller.reboot'] = {1635 setUp(done) {1636 this.sandbox = sinon.sandbox.create();1637 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1638 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1639 this.warn = this.sandbox.stub(log, 'warn');1640 this.info = this.sandbox.stub(log, 'info');1641 this.basic = this.sandbox.stub(log, 'basic');1642 this.error = this.sandbox.stub(log, 'error');1643 this.tessel = TesselSimulator({1644 name: 'TestTessel'1645 });1646 this.reboot = this.sandbox.stub(this.tessel, 'reboot');1647 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1648 return callback(this.tessel);1649 });1650 done();1651 },1652 tearDown(done) {1653 this.tessel.mockClose();1654 this.sandbox.restore();1655 done();1656 },1657 success(test) {1658 test.expect(2);1659 this.reboot.returns(Promise.resolve());1660 controller.reboot({})1661 .then(() => {1662 test.equal(this.reboot.callCount, 1);1663 test.equal(this.info.callCount, 1);1664 test.done();1665 });1666 },1667 failure(test) {1668 test.expect(1);1669 this.reboot.returns(Promise.reject());1670 controller.reboot({})1671 .catch(() => {1672 test.equal(this.reboot.callCount, 1);1673 test.done();1674 });1675 },1676};1677exports['controller.updateWithRemoteBuilds'] = {1678 setUp(done) {1679 this.sandbox = sinon.sandbox.create();1680 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1681 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1682 this.warn = this.sandbox.stub(log, 'warn');1683 this.info = this.sandbox.stub(log, 'info');1684 this.basic = this.sandbox.stub(log, 'basic');1685 this.error = this.sandbox.stub(log, 'error');1686 this.tessel = newTessel({1687 sandbox: this.sandbox,1688 authorized: true,1689 connectionType: 'LAN'1690 });1691 this.requestBuildList = this.sandbox.stub(updates, 'requestBuildList').callsFake(() => {1692 return Promise.resolve(1693 [{1694 'released': '2015-08-20T16:20:08.704Z',1695 'sha': '78f2bd20af9eaf76796657186f3010f03a979dc8',1696 'version': '0.0.3',1697 }, {1698 'released': '2015-08-18T15:12:13.070Z',1699 'sha': 'bf327359b4a13b4da07bc5776fe8a22ae88d54f9',1700 'version': '0.0.2',1701 }, {1702 'released': '2015-08-12T03:01:57.856Z',1703 'sha': '9a85c84f5a03c715908921baaaa9e7397985bc7f',1704 'version': '0.0.1',1705 }]1706 );1707 });1708 colors.enabled = false;1709 done();1710 },1711 tearDown(done) {1712 this.tessel.mockClose();1713 this.sandbox.restore();1714 colors.enabled = true;1715 done();1716 },1717 noUsbRejection(test) {1718 test.expect(1);1719 controller.updateWithRemoteBuilds({}, this.tessel)1720 .catch(error => {1721 test.equal(error.toString(), 'Must have Tessel connected over USB to complete update. Aborting update.');1722 test.done();1723 });1724 },1725 noForceRejection(test) {1726 test.expect(3);1727 this.tessel = TesselSimulator({1728 name: 'TestTessel'1729 });1730 this.fetchCurrentBuildInfo = this.sandbox.stub(this.tessel, 'fetchCurrentBuildInfo').returns(Promise.reject(new Error('No such file or directory')));1731 controller.updateWithRemoteBuilds({1732 force: false1733 }, this.tessel)1734 .catch(error => {1735 test.equal(error.toString(), 'Error: No such file or directory');1736 test.equal(this.warn.callCount, 1);1737 test.equal(this.warn.lastCall.args[0].includes('Could not find firmware version on '), true);1738 test.done();1739 });1740 },1741};1742exports['controller.restore'] = {1743 setUp(done) {1744 this.sandbox = sinon.sandbox.create();1745 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1746 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1747 this.warn = this.sandbox.stub(log, 'warn');1748 this.info = this.sandbox.stub(log, 'info');1749 this.basic = this.sandbox.stub(log, 'basic');1750 this.error = this.sandbox.stub(log, 'error');1751 this.tessel = TesselSimulator({1752 name: 'TestTessel'1753 });1754 this.get = this.sandbox.stub(controller, 'get').returns(Promise.resolve(this.tessel));1755 this.tesselRestore = this.sandbox.stub(this.tessel, 'restore').returns(Promise.resolve());1756 done();1757 },1758 tearDown(done) {1759 this.tessel.mockClose();1760 this.sandbox.restore();1761 done();1762 },1763 restoreCallPipelineResolved(test) {1764 test.expect(2);1765 controller.restore({})1766 .then(() => {1767 test.equal(this.get.callCount, 1);1768 test.equal(this.tesselRestore.callCount, 1);1769 test.done();1770 });1771 },1772 restoreCallPipelineRejected(test) {1773 test.expect(2);1774 this.tesselRestore.restore();1775 this.tesselRestore = this.sandbox.stub(this.tessel, 'restore').returns(Promise.reject(new Error('whatever')));1776 controller.restore({})1777 .catch(() => {1778 test.equal(this.get.callCount, 1);1779 test.equal(this.tesselRestore.callCount, 1);1780 test.done();1781 });1782 },1783};1784exports['controller.deploy'] = {1785 setUp(done) {1786 this.sandbox = sinon.sandbox.create();1787 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1788 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1789 this.warn = this.sandbox.stub(log, 'warn');1790 this.info = this.sandbox.stub(log, 'info');1791 this.basic = this.sandbox.stub(log, 'basic');1792 this.error = this.sandbox.stub(log, 'error');1793 this.tessel = TesselSimulator({1794 name: 'TestTessel'1795 });1796 this.deploy = this.sandbox.stub(this.tessel, 'deploy').returns(Promise.resolve());1797 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1798 return callback(this.tessel);1799 });1800 done();1801 },1802 tearDown(done) {1803 this.tessel.mockClose();1804 this.sandbox.restore();1805 done();1806 },1807 deployCallPipeline(test) {1808 test.expect(2);1809 var options = {};1810 controller.deploy(options)1811 .then(() => {1812 test.equal(this.standardTesselCommand.lastCall.args[0], options);1813 test.equal(this.deploy.callCount, 1);1814 test.done();1815 });1816 },1817};1818exports['controller.restart'] = {1819 setUp(done) {1820 this.sandbox = sinon.sandbox.create();1821 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1822 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1823 this.warn = this.sandbox.stub(log, 'warn');1824 this.info = this.sandbox.stub(log, 'info');1825 this.basic = this.sandbox.stub(log, 'basic');1826 this.error = this.sandbox.stub(log, 'error');1827 this.tessel = TesselSimulator({1828 name: 'TestTessel'1829 });1830 this.restart = this.sandbox.stub(this.tessel, 'restart').returns(Promise.resolve());1831 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1832 return callback(this.tessel);1833 });1834 done();1835 },1836 tearDown(done) {1837 this.tessel.mockClose();1838 this.sandbox.restore();1839 done();1840 },1841 restartCallPipeline(test) {1842 test.expect(2);1843 var options = {};1844 controller.restart(options)1845 .then(() => {1846 test.equal(this.standardTesselCommand.lastCall.args[0], options);1847 test.equal(this.restart.callCount, 1);1848 test.done();1849 });1850 },1851};1852exports['controller.eraseScript'] = {1853 setUp(done) {1854 this.sandbox = sinon.sandbox.create();1855 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1856 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1857 this.warn = this.sandbox.stub(log, 'warn');1858 this.info = this.sandbox.stub(log, 'info');1859 this.basic = this.sandbox.stub(log, 'basic');1860 this.error = this.sandbox.stub(log, 'error');1861 this.tessel = TesselSimulator({1862 name: 'TestTessel'1863 });1864 this.eraseScript = this.sandbox.stub(this.tessel, 'eraseScript').returns(Promise.resolve());1865 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1866 return callback(this.tessel);1867 });1868 done();1869 },1870 tearDown(done) {1871 this.tessel.mockClose();1872 this.sandbox.restore();1873 done();1874 },1875 eraseScriptCallPipeline(test) {1876 test.expect(2);1877 var options = {};1878 controller.eraseScript(options)1879 .then(() => {1880 test.equal(this.standardTesselCommand.lastCall.args[0], options);1881 test.equal(this.eraseScript.callCount, 1);1882 test.done();1883 });1884 },1885};1886exports['controller.setWiFiState'] = {1887 setUp(done) {1888 this.sandbox = sinon.sandbox.create();1889 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1890 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1891 this.warn = this.sandbox.stub(log, 'warn');1892 this.info = this.sandbox.stub(log, 'info');1893 this.basic = this.sandbox.stub(log, 'basic');1894 this.error = this.sandbox.stub(log, 'error');1895 this.tessel = TesselSimulator({1896 name: 'TestTessel'1897 });1898 this.setWiFiState = this.sandbox.stub(this.tessel, 'setWiFiState').returns(Promise.resolve());1899 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1900 return callback(this.tessel);1901 });1902 done();1903 },1904 tearDown(done) {1905 this.tessel.mockClose();1906 this.sandbox.restore();1907 done();1908 },1909 setWiFiStateCallPipeline(test) {1910 test.expect(2);1911 var options = {};1912 controller.setWiFiState(options)1913 .then(() => {1914 test.equal(this.standardTesselCommand.lastCall.args[0], options);1915 test.equal(this.setWiFiState.callCount, 1);1916 test.done();1917 });1918 },1919 setWiFiStateMissingEnable(test) {1920 test.expect(1);1921 this.setWiFiState.restore();1922 controller.setWiFiState({})1923 .then(() => {1924 test.ok(false, 'This should not be successful');1925 test.done();1926 }).catch(error => {1927 test.equal(error.toString(), 'Error: Missing Wifi State: property "enable" not provided.');1928 test.done();1929 });1930 },1931};1932exports['controller.disableAccessPoint'] = {1933 setUp(done) {1934 this.sandbox = sinon.sandbox.create();1935 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1936 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1937 this.warn = this.sandbox.stub(log, 'warn');1938 this.info = this.sandbox.stub(log, 'info');1939 this.basic = this.sandbox.stub(log, 'basic');1940 this.error = this.sandbox.stub(log, 'error');1941 this.tessel = TesselSimulator({1942 name: 'TestTessel'1943 });1944 this.disableAccessPoint = this.sandbox.stub(this.tessel, 'disableAccessPoint').returns(Promise.resolve());1945 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1946 return callback(this.tessel);1947 });1948 done();1949 },1950 tearDown(done) {1951 this.tessel.mockClose();1952 this.sandbox.restore();1953 done();1954 },1955 disableAccessPointCallPipeline(test) {1956 test.expect(2);1957 var options = {};1958 controller.disableAccessPoint(options)1959 .then(() => {1960 test.equal(this.standardTesselCommand.lastCall.args[0], options);1961 test.equal(this.disableAccessPoint.callCount, 1);1962 test.done();1963 });1964 },1965};1966exports['controller.enableAccessPoint'] = {1967 setUp(done) {1968 this.sandbox = sinon.sandbox.create();1969 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');1970 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');1971 this.warn = this.sandbox.stub(log, 'warn');1972 this.info = this.sandbox.stub(log, 'info');1973 this.basic = this.sandbox.stub(log, 'basic');1974 this.error = this.sandbox.stub(log, 'error');1975 this.tessel = TesselSimulator({1976 name: 'TestTessel'1977 });1978 this.enableAccessPoint = this.sandbox.stub(this.tessel, 'enableAccessPoint').returns(Promise.resolve());1979 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {1980 return callback(this.tessel);1981 });1982 done();1983 },1984 tearDown(done) {1985 this.tessel.mockClose();1986 this.sandbox.restore();1987 done();1988 },1989 enableAccessPointCallPipeline(test) {1990 test.expect(2);1991 var options = {};1992 controller.enableAccessPoint(options)1993 .then(() => {1994 test.equal(this.standardTesselCommand.lastCall.args[0], options);1995 test.equal(this.enableAccessPoint.callCount, 1);1996 test.done();1997 });1998 },1999};2000exports['controller.rename'] = {2001 setUp(done) {2002 this.sandbox = sinon.sandbox.create();2003 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');2004 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');2005 this.warn = this.sandbox.stub(log, 'warn');2006 this.info = this.sandbox.stub(log, 'info');2007 this.basic = this.sandbox.stub(log, 'basic');2008 this.error = this.sandbox.stub(log, 'error');2009 this.tessel = TesselSimulator({2010 name: 'TestTessel'2011 });2012 this.rename = this.sandbox.stub(this.tessel, 'rename').returns(Promise.resolve());2013 this.standardTesselCommand = this.sandbox.stub(controller, 'standardTesselCommand').callsFake((options, callback) => {2014 return callback(this.tessel);2015 });2016 colors.enabled = false;2017 done();2018 },2019 tearDown(done) {2020 this.tessel.mockClose();2021 this.sandbox.restore();2022 colors.enabled = true;2023 done();2024 },2025 willNotRenameSameAsCurrent(test) {2026 test.expect(2);2027 var options = {2028 newName: this.tessel.name,2029 };2030 controller.rename(options)2031 .then(() => {2032 // Assert that a warning was logged when2033 // the new name is the same as the old name2034 test.equal(this.warn.callCount, 1);2035 test.equal(this.warn.lastCall.args[0], 'Name of device is already TestTessel');2036 test.done();2037 });2038 },2039 renameCallPipeline(test) {2040 test.expect(4);2041 var options = {2042 // reset: true,2043 newName: 'Valid',2044 };2045 controller.rename(options)2046 .then(() => {2047 test.equal(this.standardTesselCommand.lastCall.args[0], options);2048 test.equal(this.info.callCount, 1);2049 test.equal(this.info.lastCall.args[0], 'Renaming TestTessel to Valid');2050 test.equal(this.rename.callCount, 1);2051 test.done();2052 });2053 },...

Full Screen

Full Screen

parser-fa605265.js

Source:parser-fa605265.js Github

copy

Full Screen

1import { _ as __extends } from './webapi-dc144dc6.js';2import { c as cordova$1, e as Injectable, I as IonicNativePlugin, b as cordovaPropertyGet, d as cordovaPropertySet, O as Observable, m as msg, u as util } from './messages-bded0bf9.js';3import { j as jquery } from './jquery-ad132f97.js';4var LocationAccuracy = /** @class */ (function (_super) {5 __extends(LocationAccuracy, _super);6 function LocationAccuracy() {7 var _this = _super !== null && _super.apply(this, arguments) || this;8 /**9 * Convenience constant10 * @type {number}11 */12 _this.REQUEST_PRIORITY_NO_POWER = 0;13 /**14 * Convenience constant15 * @type {number}16 */17 _this.REQUEST_PRIORITY_LOW_POWER = 1;18 /**19 * Convenience constant20 * @type {number}21 */22 _this.REQUEST_PRIORITY_BALANCED_POWER_ACCURACY = 2;23 /**24 * Convenience constant25 * @type {number}26 */27 _this.REQUEST_PRIORITY_HIGH_ACCURACY = 3;28 /**29 * Convenience constant30 * @type {number}31 */32 _this.SUCCESS_SETTINGS_SATISFIED = 0;33 /**34 * Convenience constant35 * @type {number}36 */37 _this.SUCCESS_USER_AGREED = 1;38 /**39 * Convenience constant40 * @type {number}41 */42 _this.ERROR_ALREADY_REQUESTING = -1;43 /**44 * Convenience constant45 * @type {number}46 */47 _this.ERROR_INVALID_ACTION = 0;48 /**49 * Convenience constant50 * @type {number}51 */52 _this.ERROR_INVALID_ACCURACY = 1;53 /**54 * Convenience constant55 * @type {number}56 */57 _this.ERROR_EXCEPTION = 1;58 /**59 * Convenience constant60 * @type {number}61 */62 _this.ERROR_CANNOT_CHANGE_ACCURACY = 3;63 /**64 * Convenience constant65 * @type {number}66 */67 _this.ERROR_USER_DISAGREED = 4;68 /**69 * Convenience constant70 * @type {number}71 */72 _this.ERROR_GOOGLE_API_CONNECTION_FAILED = 4;73 return _this;74 }75 LocationAccuracy.prototype.canRequest = function () { return cordova$1(this, "canRequest", {}, arguments); };76 LocationAccuracy.prototype.isRequesting = function () { return cordova$1(this, "isRequesting", {}, arguments); };77 LocationAccuracy.prototype.request = function (accuracy) { return cordova$1(this, "request", { "callbackOrder": "reverse" }, arguments); };78 LocationAccuracy.pluginName = "LocationAccuracy";79 LocationAccuracy.plugin = "cordova-plugin-request-location-accuracy";80 LocationAccuracy.pluginRef = "cordova.plugins.locationAccuracy";81 LocationAccuracy.repo = "https://github.com/dpa99c/cordova-plugin-request-location-accuracy";82 LocationAccuracy.platforms = ["Android", "iOS"];83 LocationAccuracy.decorators = [84 { type: Injectable }85 ];86 return LocationAccuracy;87}(IonicNativePlugin));88var Diagnostic = /** @class */ (function (_super) {89 __extends(Diagnostic, _super);90 function Diagnostic() {91 var _this = _super !== null && _super.apply(this, arguments) || this;92 _this.permission = {93 READ_CALENDAR: 'READ_CALENDAR',94 WRITE_CALENDAR: 'WRITE_CALENDAR',95 CAMERA: 'CAMERA',96 READ_CONTACTS: 'READ_CONTACTS',97 WRITE_CONTACTS: 'WRITE_CONTACTS',98 GET_ACCOUNTS: 'GET_ACCOUNTS',99 ACCESS_FINE_LOCATION: 'ACCESS_FINE_LOCATION',100 ACCESS_COARSE_LOCATION: 'ACCESS_COARSE_LOCATION',101 RECORD_AUDIO: 'RECORD_AUDIO',102 READ_PHONE_STATE: 'READ_PHONE_STATE',103 CALL_PHONE: 'CALL_PHONE',104 ADD_VOICEMAIL: 'ADD_VOICEMAIL',105 USE_SIP: 'USE_SIP',106 PROCESS_OUTGOING_CALLS: 'PROCESS_OUTGOING_CALLS',107 READ_CALL_LOG: 'READ_CALL_LOG',108 WRITE_CALL_LOG: 'WRITE_CALL_LOG',109 SEND_SMS: 'SEND_SMS',110 RECEIVE_SMS: 'RECEIVE_SMS',111 READ_SMS: 'READ_SMS',112 RECEIVE_WAP_PUSH: 'RECEIVE_WAP_PUSH',113 RECEIVE_MMS: 'RECEIVE_MMS',114 WRITE_EXTERNAL_STORAGE: 'WRITE_EXTERNAL_STORAGE',115 READ_EXTERNAL_STORAGE: 'READ_EXTERNAL_STORAGE',116 BODY_SENSORS: 'BODY_SENSORS',117 };118 _this.locationAuthorizationMode = {119 ALWAYS: 'always',120 WHEN_IN_USE: 'when_in_use',121 };122 _this.permissionGroups = {123 CALENDAR: ['READ_CALENDAR', 'WRITE_CALENDAR'],124 CAMERA: ['CAMERA'],125 CONTACTS: ['READ_CONTACTS', 'WRITE_CONTACTS', 'GET_ACCOUNTS'],126 LOCATION: ['ACCESS_FINE_LOCATION', 'ACCESS_COARSE_LOCATION'],127 MICROPHONE: ['RECORD_AUDIO'],128 PHONE: [129 'READ_PHONE_STATE',130 'CALL_PHONE',131 'ADD_VOICEMAIL',132 'USE_SIP',133 'PROCESS_OUTGOING_CALLS',134 'READ_CALL_LOG',135 'WRITE_CALL_LOG',136 ],137 SENSORS: ['BODY_SENSORS'],138 SMS: ['SEND_SMS', 'RECEIVE_SMS', 'READ_SMS', 'RECEIVE_WAP_PUSH', 'RECEIVE_MMS'],139 STORAGE: ['READ_EXTERNAL_STORAGE', 'WRITE_EXTERNAL_STORAGE'],140 };141 _this.locationMode = {142 HIGH_ACCURACY: 'high_accuracy',143 DEVICE_ONLY: 'device_only',144 BATTERY_SAVING: 'battery_saving',145 LOCATION_OFF: 'location_off',146 };147 _this.bluetoothState = {148 UNKNOWN: 'unknown',149 RESETTING: 'resetting',150 UNSUPPORTED: 'unsupported',151 UNAUTHORIZED: 'unauthorized',152 POWERED_OFF: 'powered_off',153 POWERED_ON: 'powered_on',154 POWERING_OFF: 'powering_off',155 POWERING_ON: 'powering_on',156 };157 return _this;158 }159 Diagnostic.prototype.isLocationAvailable = function () { return cordova$1(this, "isLocationAvailable", {}, arguments); };160 Diagnostic.prototype.isWifiAvailable = function () { return cordova$1(this, "isWifiAvailable", {}, arguments); };161 Diagnostic.prototype.isCameraAvailable = function (externalStorage) { return cordova$1(this, "isCameraAvailable", { "callbackOrder": "reverse" }, arguments); };162 Diagnostic.prototype.isBluetoothAvailable = function () { return cordova$1(this, "isBluetoothAvailable", {}, arguments); };163 Diagnostic.prototype.switchToLocationSettings = function () { return cordova$1(this, "switchToLocationSettings", { "sync": true, "platforms": ["Android", "Windows 10", "iOS"] }, arguments); };164 Diagnostic.prototype.switchToMobileDataSettings = function () { return cordova$1(this, "switchToMobileDataSettings", { "sync": true, "platforms": ["Android", "Windows 10"] }, arguments); };165 Diagnostic.prototype.switchToBluetoothSettings = function () { return cordova$1(this, "switchToBluetoothSettings", { "sync": true, "platforms": ["Android", "Windows 10"] }, arguments); };166 Diagnostic.prototype.switchToWifiSettings = function () { return cordova$1(this, "switchToWifiSettings", { "sync": true, "platforms": ["Android", "Windows 10"] }, arguments); };167 Diagnostic.prototype.isWifiEnabled = function () { return cordova$1(this, "isWifiEnabled", { "platforms": ["Android", "Windows 10"] }, arguments); };168 Diagnostic.prototype.setWifiState = function (state) { return cordova$1(this, "setWifiState", { "callbackOrder": "reverse", "platforms": ["Android", "Windows 10"] }, arguments); };169 Diagnostic.prototype.setBluetoothState = function (state) { return cordova$1(this, "setBluetoothState", { "callbackOrder": "reverse", "platforms": ["Android", "Windows 10"] }, arguments); };170 Diagnostic.prototype.isLocationEnabled = function () { return cordova$1(this, "isLocationEnabled", { "platforms": ["Android", "iOS"] }, arguments); };171 Diagnostic.prototype.isLocationAuthorized = function () { return cordova$1(this, "isLocationAuthorized", {}, arguments); };172 Diagnostic.prototype.getLocationAuthorizationStatus = function () { return cordova$1(this, "getLocationAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };173 Diagnostic.prototype.requestLocationAuthorization = function (mode) { return cordova$1(this, "requestLocationAuthorization", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };174 Diagnostic.prototype.isCameraPresent = function () { return cordova$1(this, "isCameraPresent", { "platforms": ["Android", "iOS"] }, arguments); };175 Diagnostic.prototype.isCameraAuthorized = function (externalStorage) { return cordova$1(this, "isCameraAuthorized", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };176 Diagnostic.prototype.getCameraAuthorizationStatus = function (externalStorage) { return cordova$1(this, "getCameraAuthorizationStatus", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };177 Diagnostic.prototype.requestCameraAuthorization = function (externalStorage) { return cordova$1(this, "requestCameraAuthorization", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };178 Diagnostic.prototype.isMicrophoneAuthorized = function () { return cordova$1(this, "isMicrophoneAuthorized", { "platforms": ["Android", "iOS"] }, arguments); };179 Diagnostic.prototype.getMicrophoneAuthorizationStatus = function () { return cordova$1(this, "getMicrophoneAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };180 Diagnostic.prototype.requestMicrophoneAuthorization = function () { return cordova$1(this, "requestMicrophoneAuthorization", { "platforms": ["Android", "iOS"] }, arguments); };181 Diagnostic.prototype.isContactsAuthorized = function () { return cordova$1(this, "isContactsAuthorized", { "platforms": ["Android", "iOS"] }, arguments); };182 Diagnostic.prototype.getContactsAuthorizationStatus = function () { return cordova$1(this, "getContactsAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };183 Diagnostic.prototype.requestContactsAuthorization = function () { return cordova$1(this, "requestContactsAuthorization", { "platforms": ["Android", "iOS"] }, arguments); };184 Diagnostic.prototype.isCalendarAuthorized = function () { return cordova$1(this, "isCalendarAuthorized", { "platforms": ["Android", "iOS"] }, arguments); };185 Diagnostic.prototype.getCalendarAuthorizationStatus = function () { return cordova$1(this, "getCalendarAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };186 Diagnostic.prototype.requestCalendarAuthorization = function () { return cordova$1(this, "requestCalendarAuthorization", { "platforms": ["Android", "iOS"] }, arguments); };187 Diagnostic.prototype.switchToSettings = function () { return cordova$1(this, "switchToSettings", { "platforms": ["Android", "iOS"] }, arguments); };188 Diagnostic.prototype.getBluetoothState = function () { return cordova$1(this, "getBluetoothState", { "platforms": ["Android", "iOS"] }, arguments); };189 Diagnostic.prototype.registerBluetoothStateChangeHandler = function (handler) { return cordova$1(this, "registerBluetoothStateChangeHandler", { "platforms": ["Android", "iOS"], "sync": true }, arguments); };190 Diagnostic.prototype.registerLocationStateChangeHandler = function (handler) { return cordova$1(this, "registerLocationStateChangeHandler", { "platforms": ["Android", "iOS"], "sync": true }, arguments); };191 Diagnostic.prototype.isGpsLocationAvailable = function () { return cordova$1(this, "isGpsLocationAvailable", { "platforms": ["Android"] }, arguments); };192 Diagnostic.prototype.isGpsLocationEnabled = function () { return cordova$1(this, "isGpsLocationEnabled", { "platforms": ["Android"] }, arguments); };193 Diagnostic.prototype.isNetworkLocationAvailable = function () { return cordova$1(this, "isNetworkLocationAvailable", { "platforms": ["Android"] }, arguments); };194 Diagnostic.prototype.isNetworkLocationEnabled = function () { return cordova$1(this, "isNetworkLocationEnabled", { "platforms": ["Android"] }, arguments); };195 Diagnostic.prototype.getLocationMode = function () { return cordova$1(this, "getLocationMode", { "platforms": ["Android"] }, arguments); };196 Diagnostic.prototype.getPermissionAuthorizationStatus = function (permission) { return cordova$1(this, "getPermissionAuthorizationStatus", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };197 Diagnostic.prototype.getPermissionsAuthorizationStatus = function (permissions) { return cordova$1(this, "getPermissionsAuthorizationStatus", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };198 Diagnostic.prototype.requestRuntimePermission = function (permission) { return cordova$1(this, "requestRuntimePermission", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };199 Diagnostic.prototype.requestRuntimePermissions = function (permissions) { return cordova$1(this, "requestRuntimePermissions", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };200 Diagnostic.prototype.isRequestingPermission = function () { return cordova$1(this, "isRequestingPermission", { "sync": true }, arguments); };201 Diagnostic.prototype.registerPermissionRequestCompleteHandler = function (handler) { return cordova$1(this, "registerPermissionRequestCompleteHandler", { "sync": true }, arguments); };202 Diagnostic.prototype.isBluetoothEnabled = function () { return cordova$1(this, "isBluetoothEnabled", { "platforms": ["Android"] }, arguments); };203 Diagnostic.prototype.hasBluetoothSupport = function () { return cordova$1(this, "hasBluetoothSupport", { "platforms": ["Android"] }, arguments); };204 Diagnostic.prototype.hasBluetoothLESupport = function () { return cordova$1(this, "hasBluetoothLESupport", { "platforms": ["Android"] }, arguments); };205 Diagnostic.prototype.hasBluetoothLEPeripheralSupport = function () { return cordova$1(this, "hasBluetoothLEPeripheralSupport", { "platforms": ["Android"] }, arguments); };206 Diagnostic.prototype.isExternalStorageAuthorized = function () { return cordova$1(this, "isExternalStorageAuthorized", { "platforms": ["Android"] }, arguments); };207 Diagnostic.prototype.getExternalStorageAuthorizationStatus = function () { return cordova$1(this, "getExternalStorageAuthorizationStatus", { "platforms": ["Android"] }, arguments); };208 Diagnostic.prototype.requestExternalStorageAuthorization = function () { return cordova$1(this, "requestExternalStorageAuthorization", { "platforms": ["Android"] }, arguments); };209 Diagnostic.prototype.getExternalSdCardDetails = function () { return cordova$1(this, "getExternalSdCardDetails", { "platforms": ["Android"] }, arguments); };210 Diagnostic.prototype.switchToWirelessSettings = function () { return cordova$1(this, "switchToWirelessSettings", { "platforms": ["Android"], "sync": true }, arguments); };211 Diagnostic.prototype.switchToNFCSettings = function () { return cordova$1(this, "switchToNFCSettings", { "platforms": ["Android"], "sync": true }, arguments); };212 Diagnostic.prototype.isNFCPresent = function () { return cordova$1(this, "isNFCPresent", { "platforms": ["Android"] }, arguments); };213 Diagnostic.prototype.isNFCEnabled = function () { return cordova$1(this, "isNFCEnabled", { "platforms": ["Android"] }, arguments); };214 Diagnostic.prototype.isNFCAvailable = function () { return cordova$1(this, "isNFCAvailable", { "platforms": ["Android"] }, arguments); };215 Diagnostic.prototype.registerNFCStateChangeHandler = function (handler) { return cordova$1(this, "registerNFCStateChangeHandler", { "platforms": ["Android"], "sync": true }, arguments); };216 Diagnostic.prototype.isDataRoamingEnabled = function () { return cordova$1(this, "isDataRoamingEnabled", { "platforms": ["Android"] }, arguments); };217 Diagnostic.prototype.isADBModeEnabled = function () { return cordova$1(this, "isADBModeEnabled", { "platforms": ["Android"] }, arguments); };218 Diagnostic.prototype.isDeviceRooted = function () { return cordova$1(this, "isDeviceRooted", { "platforms": ["Android"] }, arguments); };219 Diagnostic.prototype.isCameraRollAuthorized = function () { return cordova$1(this, "isCameraRollAuthorized", { "platforms": ["iOS"] }, arguments); };220 Diagnostic.prototype.getCameraRollAuthorizationStatus = function () { return cordova$1(this, "getCameraRollAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };221 Diagnostic.prototype.requestCameraRollAuthorization = function () { return cordova$1(this, "requestCameraRollAuthorization", { "platforms": ["iOS"] }, arguments); };222 Diagnostic.prototype.isRemoteNotificationsEnabled = function () { return cordova$1(this, "isRemoteNotificationsEnabled", { "platforms": ["iOS", "Android"] }, arguments); };223 Diagnostic.prototype.isRegisteredForRemoteNotifications = function () { return cordova$1(this, "isRegisteredForRemoteNotifications", { "platforms": ["iOS"] }, arguments); };224 Diagnostic.prototype.getRemoteNotificationsAuthorizationStatus = function () { return cordova$1(this, "getRemoteNotificationsAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };225 Diagnostic.prototype.requestRemoteNotificationsAuthorization = function (types, omitRegistration) { return cordova$1(this, "requestRemoteNotificationsAuthorization", { "platforms": ["iOS"] }, arguments); };226 Diagnostic.prototype.getRemoteNotificationTypes = function () { return cordova$1(this, "getRemoteNotificationTypes", { "platforms": ["iOS"] }, arguments); };227 Diagnostic.prototype.isRemindersAuthorized = function () { return cordova$1(this, "isRemindersAuthorized", { "platforms": ["iOS"] }, arguments); };228 Diagnostic.prototype.getRemindersAuthorizationStatus = function () { return cordova$1(this, "getRemindersAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };229 Diagnostic.prototype.requestRemindersAuthorization = function () { return cordova$1(this, "requestRemindersAuthorization", { "platforms": ["iOS"] }, arguments); };230 Diagnostic.prototype.isBackgroundRefreshAuthorized = function () { return cordova$1(this, "isBackgroundRefreshAuthorized", { "platforms": ["iOS"] }, arguments); };231 Diagnostic.prototype.getBackgroundRefreshStatus = function () { return cordova$1(this, "getBackgroundRefreshStatus", { "platforms": ["iOS"] }, arguments); };232 Diagnostic.prototype.requestBluetoothAuthorization = function () { return cordova$1(this, "requestBluetoothAuthorization", { "platforms": ["iOS"] }, arguments); };233 Diagnostic.prototype.isMotionAvailable = function () { return cordova$1(this, "isMotionAvailable", { "platforms": ["iOS"] }, arguments); };234 Diagnostic.prototype.isMotionRequestOutcomeAvailable = function () { return cordova$1(this, "isMotionRequestOutcomeAvailable", { "platforms": ["iOS"] }, arguments); };235 Diagnostic.prototype.requestMotionAuthorization = function () { return cordova$1(this, "requestMotionAuthorization", { "platforms": ["iOS"] }, arguments); };236 Diagnostic.prototype.getMotionAuthorizationStatus = function () { return cordova$1(this, "getMotionAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };237 Diagnostic.prototype.getLocationAccuracyAuthorization = function () { return cordova$1(this, "getLocationAccuracyAuthorization", { "platform": ["iOS"] }, arguments); };238 Diagnostic.prototype.requestTemporaryFullAccuracyAuthorization = function (purpose) { return cordova$1(this, "requestTemporaryFullAccuracyAuthorization", { "platforms": ["iOS"] }, arguments); };239 Diagnostic.prototype.registerLocationAccuracyAuthorizationChangeHandler = function (handler) { return cordova$1(this, "registerLocationAccuracyAuthorizationChangeHandler", { "platforms": ["iOS"], "sync": true }, arguments); };240 Object.defineProperty(Diagnostic.prototype, "permissionStatus", {241 get: function () { return cordovaPropertyGet(this, "permissionStatus"); },242 set: function (value) { cordovaPropertySet(this, "permissionStatus", value); },243 enumerable: false,244 configurable: true245 });246 Object.defineProperty(Diagnostic.prototype, "NFCState", {247 get: function () { return cordovaPropertyGet(this, "NFCState"); },248 set: function (value) { cordovaPropertySet(this, "NFCState", value); },249 enumerable: false,250 configurable: true251 });252 Object.defineProperty(Diagnostic.prototype, "motionStatus", {253 get: function () { return cordovaPropertyGet(this, "motionStatus"); },254 set: function (value) { cordovaPropertySet(this, "motionStatus", value); },255 enumerable: false,256 configurable: true257 });258 Diagnostic.pluginName = "Diagnostic";259 Diagnostic.plugin = "cordova.plugins.diagnostic";260 Diagnostic.pluginRef = "cordova.plugins.diagnostic";261 Diagnostic.repo = "https://github.com/dpa99c/cordova-diagnostic-plugin";262 Diagnostic.platforms = ["Android", "iOS", "Windows"];263 Diagnostic.decorators = [264 { type: Injectable }265 ];266 return Diagnostic;267}(IonicNativePlugin));268var OpenNativeSettings = /** @class */ (function (_super) {269 __extends(OpenNativeSettings, _super);270 function OpenNativeSettings() {271 return _super !== null && _super.apply(this, arguments) || this;272 }273 OpenNativeSettings.prototype.open = function (setting) { return cordova$1(this, "open", {}, arguments); };274 OpenNativeSettings.pluginName = "OpenNativeSettings";275 OpenNativeSettings.plugin = "cordova-open-native-settings";276 OpenNativeSettings.pluginRef = "cordova.plugins.settings";277 OpenNativeSettings.repo = "https://github.com/guyromb/Cordova-open-native-settings";278 OpenNativeSettings.platforms = ["Android", "iOS"];279 OpenNativeSettings.decorators = [280 { type: Injectable }281 ];282 return OpenNativeSettings;283}(IonicNativePlugin));284var Geolocation = /** @class */ (function (_super) {285 __extends(Geolocation, _super);286 function Geolocation() {287 return _super !== null && _super.apply(this, arguments) || this;288 }289 Geolocation.prototype.getCurrentPosition = function (options) { return cordova$1(this, "getCurrentPosition", { "callbackOrder": "reverse" }, arguments); };290 /**291 * Watch the current device's position. Clear the watch by unsubscribing from292 * Observable changes.293 *294 * ```typescript295 * const subscription = this.geolocation.watchPosition()296 * .filter((p) => p.coords !== undefined) //Filter Out Errors297 * .subscribe(position => {298 * console.log(position.coords.longitude + ' ' + position.coords.latitude);299 * });300 *301 * // To stop notifications302 * subscription.unsubscribe();303 * ```304 *305 * @param {GeolocationOptions} options The [geolocation options](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions).306 * @returns {Observable<Geoposition | PositionError>} Returns an Observable that notifies with the [position](https://developer.mozilla.org/en-US/docs/Web/API/Position) of the device, or errors.307 */308 Geolocation.prototype.watchPosition = function (options) {309 return new Observable(function (observer) {310 var watchId = navigator.geolocation.watchPosition(observer.next.bind(observer), observer.next.bind(observer), options);311 return function () { return navigator.geolocation.clearWatch(watchId); };312 });313 };314 Geolocation.pluginName = "Geolocation";315 Geolocation.plugin = "cordova-plugin-geolocation";316 Geolocation.pluginRef = "navigator.geolocation";317 Geolocation.repo = "https://github.com/apache/cordova-plugin-geolocation";318 Geolocation.install = "ionic cordova plugin add cordova-plugin-geolocation --variable GEOLOCATION_USAGE_DESCRIPTION=\"To locate you\"";319 Geolocation.installVariables = ["GEOLOCATION_USAGE_DESCRIPTION"];320 Geolocation.platforms = ["Amazon Fire OS", "Android", "Browser", "iOS", "Windows"];321 Geolocation.decorators = [322 { type: Injectable }323 ];324 return Geolocation;325}(IonicNativePlugin));326var gps;327(function (gps) {328 let locationAccuracy = new LocationAccuracy;329 let diagnostic = new Diagnostic;330 /* alert('position.coords.latitude: ' + position.coords.latitude + '\n' +331 'position.coords.longitude: ' + position.coords.longitude + '\n' +332 'position.coords.altitude: ' + position.coords.altitude + '\n' +333 'position.coords.accuracy: ' + position.coords.accuracy + '\n' +334 'position.coords.altitudeAccuracy: ' + position.coords.altitudeAccuracy + '\n' +335 'position.coords.heading: ' + position.coords.heading + '\n' +336 'position.coords.speed: ' + position.coords.speed + '\n' +337 'position.timestamp: ' + position.timestamp + '\n');338 */339 async function getCoords(geoTimeout = 10000, maximumAge = 10) {340 const geolocation = new Geolocation;341 return new Promise(async (resolve, reject) => {342 var geoOpt = { maximumAge: maximumAge, timeout: geoTimeout, enableHighAccuracy: true };343 let id = geolocation.watchPosition(geoOpt)344 .subscribe((pos) => {345 id.unsubscribe();346 if (pos.constructor.name === 'Geoposition' || pos.constructor.name === 'GeolocationPosition' || pos.constructor.name === 'Position')347 resolve(pos);348 else {349 getCoordsError(pos);350 reject(pos);351 }352 });353 });354 }355 gps.getCoords = getCoords;356 function getCoordsError(error) {357 if (error.code == 1) {358 msg.danger(util.translate('exceptions.gpsAccess'));359 }360 else if (error.code == 3) {361 msg.danger(util.translate('exceptions.gpstimeout'));362 }363 else {364 alert('code: ' + error.code + '\n' +365 'message: ' + error.message + '\n');366 }367 }368 function checkAndAskGPSPermissions() {369 diagnostic.isLocationAuthorized().then(async (result) => {370 if (await gpsOff()) {371 try {372 await locationAccuracy.request(locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);373 }374 catch (err) { }375 }376 if (!result)377 await diagnostic.requestLocationAuthorization();378 }, err => { msg.showError('Error requesting location permissions: ' + err); });379 }380 gps.checkAndAskGPSPermissions = checkAndAskGPSPermissions;381 function checkGPSPermission() {382 diagnostic.isLocationAuthorized().then(result => {383 if (result)384 activationMsg(true);385 else386 activationMsg(false);387 }, err => { msg.showError('Error requesting location permissions: ' + err); });388 }389 gps.checkGPSPermission = checkGPSPermission;390 function requestGPSPermission(actMsg) {391 diagnostic.requestLocationAuthorization().then((result) => {392 if (result === 'DENIED_ALWAYS') {393 let openNativeSettings = new OpenNativeSettings;394 openNativeSettings.open('location').then(async () => {395 if (await diagnostic.isLocationAuthorized())396 askToTurnOnGPS(actMsg);397 });398 }399 else if (result !== 'DENIED_ONCE')400 askToTurnOnGPS(actMsg);401 }, err => { if (err.code !== 4)402 msg.showError('Error requesting location permissions: ' + err.message); });403 }404 function askToTurnOnGPS(actMsg) {405 locationAccuracy.request(locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY).then(() => { actMsg.dismiss(); }, err => { if (err.code !== 4)406 msg.showError('Error requesting location permissions: ' + err.message); });407 }408 async function activationMsg(permission) {409 if (await gpsOff() || !permission) {410 const actMsg = document.createElement('ion-alert');411 actMsg.header = util.translate("gps.activationMsg");412 actMsg.backdropDismiss = false;413 actMsg.buttons = [414 {415 text: util.translate('Activate'),416 handler: () => {417 if (permission)418 askToTurnOnGPS(actMsg);419 else420 requestGPSPermission(actMsg);421 return false;422 }423 }424 ];425 document.body.appendChild(actMsg);426 actMsg.present();427 }428 }429 async function gpsOff() {430 if (cordova.platformId === 'ios') {431 return await locationAccuracy.canRequest();432 }433 else {434 let mode = await diagnostic.getLocationMode();435 if (mode === diagnostic.locationMode.LOCATION_OFF)436 return true;437 else438 return false;439 }440 }441})(gps || (gps = {}));442var parser;443(function (parser) {444 var culture = 'es-es';445 async function recursiveCompile(json, template, conf, contextFunctions, lastTemplate, AddTimeZone = false) {446 let reg = /{{([^{}]+)}}/g;447 let hasMoreMatches = template.match(reg);448 culture = conf.user.currentUserCultureId;449 let retString = template;450 if (json) {451 retString = await parser.compile(json, retString, conf.resources, contextFunctions, AddTimeZone);452 }453 ;454 if (conf && conf.user) {455 retString = await parser.compile(conf.user, retString, conf.resources, contextFunctions, AddTimeZone);456 }457 ;458 if ((!lastTemplate || retString != lastTemplate) && hasMoreMatches != null) {459 retString = await parser.recursiveCompile(json, retString, conf, contextFunctions, retString, AddTimeZone);460 }461 return retString;462 }463 parser.recursiveCompile = recursiveCompile;464 async function compile(json, template, files, contextFunctions, AddTimeZone = false) {465 let reg = /{{([^{}]+)}}/g;466 let matches = template.match(reg);467 let retString = template;468 let defDateFormat = 'LL';469 if (matches != null) {470 json = lowerKeys(json);471 let contextVars = lowerKeys(this);472 for (let i = 0; i < matches.length; i++) {473 var skipReplace = false;474 let marker = matches[i];475 let rValue = '';476 let isFunction = false;477 if (marker.indexOf('(') != -1) {478 try {479 let fFunc = marker.substring(2, marker.length - 2).trim();480 let fName = fFunc.substring(0, fFunc.indexOf('(')).trim();481 if (contextFunctions && typeof contextFunctions[fName] === 'function' || typeof execDynamicCode.call(this, fName) === 'function') {482 isFunction = true;483 }484 }485 catch (e) {486 }487 }488 if (isFunction) {489 //Es una funcion javascript.490 let fFunc = marker.substring(2, marker.length - 2).trim();491 let fName = fFunc.substring(0, fFunc.indexOf('(')).trim();492 let fParams = this.splitParams(fFunc.substring(fFunc.indexOf('(') + 1, fFunc.lastIndexOf(')')).trim());493 for (let j = 0; j < fParams.length; j++) {494 let jKey = fParams[j].toLowerCase().trim();495 if ((jKey.startsWith("'") && jKey.endsWith("'")) || (jKey.startsWith('"') && jKey.endsWith('"'))) {496 fParams[j] = jKey.slice(1, -1);497 }498 else if (jKey.startsWith("[") && jKey.endsWith("]")) {499 fParams[j] = eval(jKey);500 }501 else if ((json && (typeof json[jKey] != 'undefined')) || (contextVars && (typeof contextVars[jKey] != 'undefined') && (contextVars[jKey] != null)) || jKey === 'json' || jKey === 'template' || jKey === 'contextfunctions') {502 let value;503 if (json && (typeof json[jKey] != 'undefined')) {504 value = parser.getValue(json[jKey]);505 }506 else if (jKey === 'json') {507 value = json;508 }509 else if (jKey === 'template') {510 value = template;511 }512 else if (jKey === 'contextfunctions') {513 value = contextFunctions;514 }515 else {516 value = contextVars[jKey];517 }518 fParams[j] = value;519 }520 }521 try {522 if (contextFunctions && typeof contextFunctions[fName] != 'undefined') {523 rValue = contextFunctions[fName].apply(contextFunctions, fParams);524 }525 else {526 let found = false;527 let fClass = fName.split('.');528 switch (fClass.length) {529 case 1:530 found = true;531 rValue = window[fClass[0]](...fParams);532 break;533 case 2:534 found = true;535 rValue = window[fClass[0]][fClass[1]](...fParams);536 break;537 case 3:538 found = true;539 rValue = window[fClass[0]][fClass[1]][fClass[2]](...fParams);540 break;541 case 4:542 found = true;543 rValue = window[fClass[0]][fClass[1]][fClass[2]][fClass[3]](...fParams);544 break;545 case 5:546 found = true;547 rValue = window[fClass[0]][fClass[1]][fClass[2]][fClass[3]][fClass[4]](...fParams);548 break;549 case 6:550 found = true;551 rValue = window[fClass[0]][fClass[1]][fClass[2]][fClass[3]][fClass[4]][fClass[5]](...fParams);552 break;553 }554 if (!found) {555 rValue = execDynamicCode.call(this, fName).apply(null, fParams);556 }557 }558 if (rValue instanceof Promise) {559 rValue = await Promise.resolve(rValue);560 }561 }562 catch (ex) {563 rValue = ex.message;564 }565 }566 else if (marker.indexOf('|') != -1) {567 //Lleva algún tipo de formato.568 let auxMarker = marker.substring(2, marker.length - 2).trim();569 let jKeyUp = auxMarker.split('|')[0];570 let propFormat = auxMarker.split('|')[1];571 let jKey = jKeyUp.toLowerCase();572 if (propFormat.toLowerCase() == 'file') {573 let found = false;574 for (let i = 0; i < files.length; i++) {575 if (files[i].FileName.toLowerCase() == jKeyUp.toLowerCase()) {576 found = true;577 rValue = 'data:' + files[i].MimeType + ';base64,' + files[i].B64;578 break;579 }580 }581 if (!found) {582 rValue = jKeyUp;583 }584 }585 else {586 if ((json && typeof json[jKey] != 'undefined') || (contextVars && typeof contextVars[jKey] != 'undefined') || (contextFunctions && typeof contextFunctions[jKeyUp] != 'undefined') || (jKey == 'currentdatetime') || (jKey == 'currentdate') || (jKey == 'currenttime') || (jKey == 'currenttime') || (jKey == 'newguid')) {587 if (jKey == 'currentdatetime' || jKey == 'currentdate' || jKey == 'currenttime') {588 rValue = moment().toDate();589 }590 else if (jKey == 'newguid') {591 rValue = util.GUID();592 }593 else if (json && typeof json[jKey] != 'undefined') {594 rValue = parser.getValue(json[jKey], 'Value');595 }596 else if (contextVars && typeof contextVars[jKey] != 'undefined') {597 rValue = contextVars[jKey];598 }599 else if (contextFunctions && typeof contextFunctions[jKeyUp] != 'undefined') {600 rValue = contextFunctions[jKeyUp];601 }602 let typeF = propFormat.toLowerCase();603 let strFormat = '';604 if (typeF.indexOf(':') != -1) {605 typeF = propFormat.substring(propFormat.indexOf(':'), 0).toLowerCase();606 strFormat = propFormat.substring(propFormat.indexOf(':') + 1);607 }608 if (typeF == 'date') {609 /*{{datevalue|date:LLL}*/610 if (strFormat == '') {611 strFormat = defDateFormat;612 }613 if (strFormat == 'W') {614 if (AddTimeZone) {615 rValue = moment(rValue).locale(culture).format();616 }617 else {618 rValue = moment.utc(rValue).locale(culture).format();619 }620 }621 else {622 if (rValue && rValue != '' && moment.utc(rValue).isValid()) {623 if (AddTimeZone) {624 rValue = moment(rValue).locale(culture).format(strFormat);625 }626 else {627 rValue = moment.utc(rValue).locale(culture).format(strFormat);628 }629 }630 else {631 rValue = '';632 }633 }634 }635 else if (typeF == 'fromnow') { /*{{datevalue|fromnow:LLL}*/636 if (rValue && rValue != '' && moment.utc(rValue).isValid()) {637 if (AddTimeZone) {638 rValue = moment(rValue).locale(culture).fromNow();639 }640 else {641 rValue = moment(moment.utc(rValue).format().split('+')[0]).locale(culture).fromNow();642 }643 }644 }645 else if (typeF == 'tonow') { /*{{datevalue|tonow:LLL}*/646 if (rValue && rValue != '' && moment.utc(rValue).isValid()) {647 if (AddTimeZone) {648 rValue = moment(rValue).locale(culture).toNow();649 }650 else {651 rValue = moment(moment.utc(rValue).format().split('+')[0]).locale(culture).toNow();652 }653 }654 }655 else if (typeF == 'decimal') { /*{{value|decimal:3}*/656 if (rValue && rValue != '' && jquery.isNumeric(rValue)) {657 if (strFormat && strFormat != '') {658 if (culture == 'es-ES') {659 rValue = parseFloat(parseFloat(rValue).toFixed(strFormat)).toLocaleString('ca-ES', { minimumFractionDigits: strFormat });660 }661 else {662 rValue = parseFloat(parseFloat(rValue).toFixed(strFormat)).toLocaleString(culture, { minimumFractionDigits: strFormat });663 }664 }665 else {666 if (culture == 'es-ES') {667 rValue = parseFloat(rValue).toLocaleString('ca-ES');668 }669 else {670 rValue = parseFloat(rValue).toLocaleString(culture);671 }672 }673 }674 }675 else if (typeF == 'switch') { /*{{value|switch:[true:icon-check,false:icon-noncheck,null:icon-cancel,else:]}*/676 let found = false;677 if (rValue == null) {678 rValue = 'null';679 }680 //Convert expresion into object681 let valuesTemp = strFormat.toString().trim();682 valuesTemp = valuesTemp.substring(1, valuesTemp.length - 1);683 valuesTemp = valuesTemp.split(',');684 let values = new Object();685 for (let z = 0; z < valuesTemp.length; z++) {686 let arrKey = valuesTemp[z].split(':')[0].toString().trim();687 let arrValue = valuesTemp[z].split(':')[1].toString().trim();688 values[arrKey] = arrValue;689 }690 for (let switchvalue in values) {691 if (switchvalue.toLowerCase() == rValue.toString().toLowerCase()) {692 rValue = values[switchvalue];693 found = true;694 break;695 }696 }697 if (!found && typeof values['else'] != 'undefined') {698 rValue = values['else'];699 if (rValue == 'null') {700 rValue = '';701 }702 }703 }704 else if (typeF == 'string') { /*{{str|string:lower}*/ /*{{str|string:upper}*/ /*{{str|string:255}*/705 if (rValue && rValue != '') {706 if (strFormat.toLowerCase() == 'lower') {707 rValue = rValue.toLowerCase();708 }709 else if (strFormat.toLowerCase() == 'upper') {710 rValue = rValue.toUpperCase();711 }712 else if (jquery.isNumeric(strFormat) && (rValue.length > parseFloat(strFormat))) {713 rValue = rValue.substring(0, parseFloat(strFormat)) + '...';714 }715 rValue = parser.replaceAll(rValue, '\n', '<br>');716 }717 else {718 rValue = '';719 }720 }721 else if (typeF == 'isnull') { /*{{str|isnull:value}*/722 let arrFormat = strFormat.split(',');723 if (rValue == null || rValue === '' || rValue == 'null') {724 rValue = arrFormat[0];725 }726 else if (arrFormat.length > 1) {727 rValue = strFormat.substring(strFormat.indexOf(',') + 1);728 }729 }730 else if (typeF == 'bool') { /*{{value|bool:'true value','false 0 empty or null value'}*/731 let arrFormat = strFormat.split(',');732 if (typeof rValue == 'undefined' || rValue == null || !rValue || rValue == '' || rValue == '0' || rValue.toString().toLowerCase() == 'false' || rValue.toString().toLowerCase() == 'null') {733 if (arrFormat.length > 1) {734 rValue = arrFormat[1];735 }736 else {737 rValue = '';738 }739 }740 else {741 rValue = arrFormat[0];742 }743 }744 else if (typeF == 'value') {745 if (rValue == null) {746 rValue = '';747 }748 }749 else if (typeF == 'html' || typeF == 'htmlattr') {750 rValue = escapeHtmlString(rValue, typeF == 'htmlattr');751 }752 else if (typeF == 'js') {753 rValue = escapeJsString(rValue);754 }755 else if (typeF == 'sql') {756 rValue = escapeSqltring(rValue);757 }758 }759 else {760 skipReplace = true;761 }762 }763 }764 else {765 //Es un marcador simple.766 let jKeyUp = marker.substring(2, marker.length - 2).trim();767 let jKey = jKeyUp.toLowerCase();768 if ((json && typeof json[jKey.toLowerCase()] != 'undefined') || (contextVars && typeof contextVars[jKey.toLowerCase()] != 'undefined') || (contextFunctions && typeof contextFunctions[jKeyUp] != 'undefined') || (jKey == 'currentdatetime') || (jKey == 'currentdate') || (jKey == 'currentlocation') || (jKey == 'currentaltitude') || (jKey == 'currentlongitude') || (jKey == 'currentlatitude') || (jKey == 'currenttime') || (jKey == 'newguid')) {769 if (jKey == 'currentdatetime') {770 rValue = util.currentDateTime();771 }772 else if (jKey == 'currentdate') {773 rValue = util.currentDate();774 }775 else if (jKey == 'currenttime') {776 rValue = util.currentTime();777 }778 else if (jKey == 'newguid') {779 rValue = util.GUID();780 }781 else if (jKey == 'currentlocation') {782 let pos = await gps.getCoords();783 rValue = pos.coords.latitude + ', ' + pos.coords.longitude;784 }785 else if (jKey == 'currentaltitude') {786 let pos = await gps.getCoords();787 rValue = pos.coords.altitude;788 }789 else if (jKey == 'currentlongitude') {790 let pos = await gps.getCoords();791 rValue = pos.coords.longitude;792 }793 else if (jKey == 'currentlatitude') {794 let pos = await gps.getCoords();795 rValue = pos.coords.latitude;796 }797 else if (json && typeof json[jKey] != 'undefined' && json[jKey] != null) {798 rValue = parser.getValue(json[jKey]);799 }800 else if (contextVars && typeof contextVars[jKey] != 'undefined') {801 rValue = contextVars[jKey];802 }803 else if (contextFunctions && typeof contextFunctions[jKeyUp] != 'undefined') {804 rValue = contextFunctions[jKeyUp];805 }806 }807 else {808 skipReplace = true;809 }810 if (typeof rValue == 'string' && rValue.indexOf('/Date') != -1) {811 rValue = moment(rValue).locale(culture).format(defDateFormat);812 }813 else if (typeof rValue == 'object' && rValue != null && rValue.Hours) {814 rValue = moment(rValue).utc().format('LTS');815 }816 if (rValue == null) {817 rValue = '';818 }819 }820 if (!skipReplace) {821 retString = parser.replaceAll(retString, marker, rValue);822 }823 }824 }825 return retString;826 }827 parser.compile = compile;828 function findTemplate(obj, typeId, pageName) {829 if (obj) {830 for (let i = 0; i < obj.pages.length; i++) {831 if (pageName) {832 if (obj.pages[i].pageName.toLowerCase() == pageName.toLowerCase()) {833 if (!obj.pages[i].SQLSentence) {834 obj.pages[i].SQLSentence = 'select * from ' + obj.tableName + ' where `' + obj.tableName + '`.`_isDeleted`=0';835 }836 return obj.pages[i];837 }838 }839 else {840 if (obj.pages[i].typeId.toLowerCase() == typeId.toLowerCase() && obj.pages[i].isDefault == true) {841 if (!obj.pages[i].SQLSentence) {842 obj.pages[i].SQLSentence = 'select * from ' + obj.tableName + ' where `' + obj.tableName + '`.`_isDeleted`=0';843 }844 return obj.pages[i];845 }846 }847 }848 }849 return null;850 }851 parser.findTemplate = findTemplate;852 function getValue(val, prop) {853 if (val == null) {854 return null;855 }856 let type = typeof val;857 type = type.toLocaleLowerCase();858 if (type == 'object') {859 if (prop) {860 return val[prop];861 }862 else {863 return val.Text;864 }865 }866 else {867 return val;868 }869 }870 parser.getValue = getValue;871 function replaceAll(str, find, replace) {872 if (!str || find == replace) {873 return str;874 }875 const escapeRegExp = (string) => {876 return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');877 };878 return str.toString().replace(new RegExp(escapeRegExp(find), 'ig'), replace);879 }880 parser.replaceAll = replaceAll;881 function formatDate(value) {882 return value;883 }884 parser.formatDate = formatDate;885 function formatNumber(value) {886 return value;887 }888 parser.formatNumber = formatNumber;889 function formatDecimal(value) {890 return value;891 }892 parser.formatDecimal = formatDecimal;893 /**894 * Returns an escaped JS string895 * @method escapeJsString896 * @param {string} str - String897*/898 function escapeJsString(str) {899 if (str) {900 str = replaceAll(str, '\\', '\\\\');901 str = replaceAll(str, '\'', '\\\'');902 str = replaceAll(str, "\"", '&quot;');903 }904 return str;905 }906 parser.escapeJsString = escapeJsString;907 /**908 * Returns an escaped SQL string909 * @method escapeSqlString910 * @param {string} str - String911 */912 function escapeSqltring(str) {913 if (str) {914 str = replaceAll(str, "'", "''");915 }916 return str;917 }918 parser.escapeSqltring = escapeSqltring;919 function splitParams(pStr) {920 let params = [];921 let newParam = '';922 let arrOpened = false;923 for (let i = 0; i < pStr.length; i++) {924 if (pStr[i] == ',' && !arrOpened) {925 params.push(newParam);926 newParam = '';927 }928 else {929 if (pStr[i] == '[') {930 arrOpened = true;931 }932 if (pStr[i] == ']') {933 arrOpened = false;934 }935 newParam += pStr[i];936 }937 }938 if (newParam) {939 params.push(newParam);940 }941 return params;942 }943 parser.splitParams = splitParams;944 /**945 * Returns an escapep HTML string946 * @method escapeHtmlString947 * @param {string} str - String948 * @param {boolean} attr - Determine if the line breaks are substituted949 */950 function escapeHtmlString(str, attr) {951 if (str) {952 str = replaceAll(str, '&', '&amp;');953 str = replaceAll(str, '<', '&lt;');954 str = replaceAll(str, '>', '&gt;');955 str = replaceAll(str, '"', '&quot');956 str = replaceAll(str, "'", '&#39;');957 str = replaceAll(str, ',', '&#44;');958 str = replaceAll(str, ':', '&#58;');959 str = replaceAll(str, '|', '&#124;');960 if (attr) {961 str = replaceAll(str, '\\', '\\\\');962 str = replaceAll(str, '\n', '');963 str = replaceAll(str, '\r', '');964 str = replaceAll(str, '&#39;', '\\\'');965 }966 }967 return str;968 }969 parser.escapeHtmlString = escapeHtmlString;970 /**971 * Transform object keys into lower case.972 * @param {object} obj - Object to transform.973 * @param {string} [recursive=false] - Set recursive mode on/off.974 * @method lowerKeys975 * @return {object} transformed object.976 */977 function lowerKeys(obj, recursive = false) {978 if (obj) {979 var key, keys = Object.keys(obj);980 var n = keys.length;981 var newobj = {};982 for (var i = 0; i < n; i++) {983 key = keys[i];984 if (recursive && (typeof obj[key] === "object") && (obj[key] !== null) && (key.toLowerCase() !== 'objectdefaults')) {985 newobj[key.toLowerCase()] = lowerKeys(obj[key], recursive);986 }987 else {988 newobj[key.toLowerCase()] = obj[key];989 }990 }991 return newobj;992 }993 else {994 return null;995 }996 }997 parser.lowerKeys = lowerKeys;998 /**999 * Evaluates JavaScript code and executes it.1000 * @param {string} dynamicCode - Dynamic Code.1001 * @method execDynamicCode1002 * @return {any}1003 */1004 function execDynamicCode(dynamicCode) {1005 return eval(dynamicCode);1006 /*jQuery.globalEval*/1007 }1008 parser.execDynamicCode = execDynamicCode;1009 /**1010 * Sorts an object's array by specified properties.1011 * @param {object} obj - Object to order.1012 * @param {string} property - Order property1013 * @param {string} [property2] - Second order property1014 * @method sortObject1015 * @return {any[]} Ordered object.1016 */1017 function sortObject(obj, property, property2) {1018 var sortable = [];1019 var key;1020 for (key in obj) {1021 sortable.push(obj[key]);1022 }1023 sortable.sort(function (a, b) {1024 var o1 = a[property];1025 var o2 = b[property];1026 if (o1 < o2)1027 return -1;1028 if (o1 > o2)1029 return 1;1030 if (property2) {1031 var p1 = a[property2];1032 var p2 = b[property2];1033 if (p1 < p2)1034 return -1;1035 if (p1 > p2)1036 return 1;1037 }1038 return 0;1039 });1040 return sortable;1041 }1042 parser.sortObject = sortObject;1043})(parser || (parser = {}));...

Full Screen

Full Screen

adb-commands.js

Source:adb-commands.js Github

copy

Full Screen

...681 * is an emulator rather than a real device.682 */683methods.setWifiAndData = async function ({wifi, data}, isEmulator = false) {684 if (!_.isUndefined(wifi)) {685 this.setWifiState(wifi, isEmulator);686 }687 if (!_.isUndefined(data)) {688 this.setDataState(data, isEmulator);689 }690};691/**692 * Change the state of animation on the device under test.693 * Animation on the device is controlled by the following global properties:694 * [ANIMATOR_DURATION_SCALE]{@link https://developer.android.com/reference/android/provider/Settings.Global.html#ANIMATOR_DURATION_SCALE},695 * [TRANSITION_ANIMATION_SCALE]{@link https://developer.android.com/reference/android/provider/Settings.Global.html#TRANSITION_ANIMATION_SCALE},696 * [WINDOW_ANIMATION_SCALE]{@link https://developer.android.com/reference/android/provider/Settings.Global.html#WINDOW_ANIMATION_SCALE}.697 * This method sets all this properties to 0.0 to disable (1.0 to enable) animation.698 *699 * Turning off animation might be useful to improve stability...

Full Screen

Full Screen

bin-tessel-2.js

Source:bin-tessel-2.js Github

copy

Full Screen

1// Test dependencies are required and exposed in common/bootstrap.js2require('../common/bootstrap');3// If the defaults are intentionally changed in bin-tessel-2,4// then they must be changed here as well. This ensures that the5// expected default command options are protected from regressions.6// This should be used as a guide for reviewing new tessel-centric7// additions to the cli command set.8/*global CrashReporter */9var defaults = {10 timeout: {11 abbr: 't',12 metavar: 'TIMEOUT',13 help: 'Set timeout in seconds for scanning for networked tessels',14 default: 5,15 name: 'timeout',16 },17 name: {18 metavar: 'NAME',19 help: 'The name of the tessel on which the command will be executed',20 name: 'name',21 },22 lan: {23 flag: true,24 help: 'Use only a LAN connection',25 name: 'lan',26 string: '--lan',27 },28 usb: {29 flag: true,30 help: 'Use only a USB connection',31 name: 'usb',32 string: '--usb',33 },34 lanPrefer: {35 flag: true,36 default: false,37 help: 'Prefer a LAN connection if it\'s available, otherwise use USB'38 }39};40exports['Tessel (t2: makeCommand)'] = {41 any(test) {42 test.expect(16);43 t2.makeCommand('any')44 .callback(function() {45 test.equal(this.specs.timeout.abbr, defaults.timeout.abbr);46 test.equal(this.specs.timeout.default, defaults.timeout.default);47 test.equal(this.specs.timeout.help, defaults.timeout.help);48 test.equal(this.specs.timeout.metavar, defaults.timeout.metavar);49 test.equal(this.specs.timeout.name, defaults.timeout.name);50 test.equal(this.specs.name.help, defaults.name.help);51 test.equal(this.specs.name.metavar, defaults.name.metavar);52 test.equal(this.specs.name.name, defaults.name.name);53 test.equal(this.specs.lan.flag, defaults.lan.flag);54 test.equal(this.specs.lan.help, defaults.lan.help);55 test.equal(this.specs.lan.string, defaults.lan.string);56 test.equal(this.specs.lan.name, defaults.lan.name);57 test.equal(this.specs.usb.flag, defaults.usb.flag);58 test.equal(this.specs.usb.help, defaults.usb.help);59 test.equal(this.specs.usb.string, defaults.usb.string);60 test.equal(this.specs.usb.name, defaults.usb.name);61 test.done();62 });63 t2(['any']);64 }65};66exports['Tessel (t2: restart)'] = {67 setUp(done) {68 this.sandbox = sinon.sandbox.create();69 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');70 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');71 this.error = this.sandbox.stub(log, 'error');72 this.warn = this.sandbox.stub(log, 'warn');73 this.info = this.sandbox.stub(log, 'info');74 this.restart = this.sandbox.stub(controller, 'restart').returns(Promise.resolve());75 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');76 this.closeSuccessfulCommand = this.sandbox.stub(t2, 'closeSuccessfulCommand');77 this.processExit = this.sandbox.stub(process, 'exit');78 done();79 },80 tearDown(done) {81 this.sandbox.restore();82 done();83 },84 noError(test) {85 test.expect(1);86 t2(['restart', '--entryPoint=index.js', '--type=ram']);87 test.equal(this.restart.callCount, 1);88 // We must wait for the command to complete89 // or else the sandbox will be cleared too early90 setImmediate(test.done);91 },92 exitCodeOne(test) {93 test.expect(4);94 var error = new Error('Some error happened.');95 var restartOp = Promise.reject(error);96 this.restart.returns(restartOp);97 t2(['restart', '--entryPoint=index.js', '--type=ram']);98 restartOp.catch(() => {99 test.equal(this.restart.callCount, 1);100 test.equal(this.closeFailedCommand.callCount, 1);101 test.equal(this.closeFailedCommand.lastCall.args[0], error);102 test.equal(this.processExit.lastCall.args[0], 1);103 test.done();104 });105 },106 invalidType(test) {107 test.expect(4);108 t2(['restart', '--entryPoint=index.js', '--type=any']);109 setImmediate(() => {110 // Calling restart should not be reached111 test.equal(this.restart.callCount, 0);112 test.equal(this.closeFailedCommand.callCount, 1);113 test.equal(this.closeFailedCommand.lastCall.args[0].trim(), '--type Invalid');114 test.equal(this.processExit.lastCall.args[0], 1);115 test.done();116 });117 },118 entryPointFallbackToPrevious(test) {119 test.expect(1);120 var restartOp = Promise.resolve();121 this.sandbox.stub(Preferences, 'read').returns(Promise.resolve('previous.js'));122 t2(['restart']);123 this.restart.returns(restartOp);124 restartOp.then(() => {125 test.equal(this.restart.lastCall.args[0].entryPoint, 'previous.js');126 test.done();127 });128 },129 entryPointFallbackNoPrevious(test) {130 test.expect(1);131 this.closeFailedCommand.restore();132 this.closeFailedCommand = this.sandbox.stub(t2, 'closeFailedCommand');133 var resolved = Promise.resolve('');134 this.sandbox.stub(Preferences, 'read').returns(resolved);135 t2(['restart']);136 resolved.then(() => {137 test.equal(this.closeFailedCommand.lastCall.args[0], 'Cannot determine entry point file name');138 test.done();139 });140 },141 entryPointFallbackNoPreviousUndefined(test) {142 test.expect(1);143 this.closeFailedCommand.restore();144 this.closeFailedCommand = this.sandbox.stub(t2, 'closeFailedCommand');145 var resolved = Promise.resolve(undefined);146 this.sandbox.stub(Preferences, 'read').returns(resolved);147 t2(['restart']);148 resolved.then(() => {149 test.equal(this.closeFailedCommand.lastCall.args[0], 'Cannot determine entry point file name');150 test.done();151 });152 },153};154exports['Tessel (t2: update)'] = {155 setUp(done) {156 this.sandbox = sinon.sandbox.create();157 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');158 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');159 this.error = this.sandbox.stub(log, 'error');160 this.warn = this.sandbox.stub(log, 'warn');161 this.printAvailableUpdates = this.sandbox.stub(controller, 'printAvailableUpdates').returns(Promise.resolve());162 this.update = this.sandbox.stub(controller, 'update').returns(Promise.resolve());163 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');164 this.processExit = this.sandbox.stub(process, 'exit');165 done();166 },167 tearDown(done) {168 this.sandbox.restore();169 done();170 },171 optsForwarding(test) {172 test.expect(4);173 t2(['update', '--version', '42']);174 test.equal(this.update.callCount, 1);175 test.deepEqual(this.update.lastCall.args[0], {176 0: 'update',177 version: 42,178 _: ['update'],179 timeout: 5,180 lanPrefer: false,181 output: true,182 loglevel: 'basic',183 });184 t2(['update', '--list']);185 // controller.update is not called for --list,186 // so callCount remains 1187 test.equal(this.update.callCount, 1);188 test.equal(this.printAvailableUpdates.callCount, 1);189 // We must wait for the command to complete190 // or else the sandbox will be cleared to early191 setImmediate(test.done);192 },193 noError(test) {194 test.expect(1);195 t2(['update']);196 test.equal(this.update.callCount, 1);197 // We must wait for the command to complete198 // or else the sandbox will be cleared to early199 setImmediate(test.done);200 },201 exitCodeOne(test) {202 test.expect(4);203 var error = new Error('Some error happened.');204 var updateOp = Promise.reject(error);205 this.update.returns(updateOp);206 t2(['update']);207 updateOp.catch(() => {208 test.equal(this.update.callCount, 1);209 test.equal(this.closeFailedCommand.callCount, 1);210 test.equal(this.closeFailedCommand.lastCall.args[0], error);211 test.equal(this.processExit.lastCall.args[0], 1);212 test.done();213 });214 },215};216exports['Tessel (t2: restore)'] = {217 setUp(done) {218 this.sandbox = sinon.sandbox.create();219 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');220 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');221 this.error = this.sandbox.stub(log, 'error');222 this.warn = this.sandbox.stub(log, 'warn');223 this.restore = this.sandbox.stub(controller, 'restore').returns(Promise.resolve());224 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');225 this.processExit = this.sandbox.stub(process, 'exit');226 done();227 },228 tearDown(done) {229 this.sandbox.restore();230 done();231 },232 noError(test) {233 test.expect(1);234 t2(['restore']);235 setImmediate(() => {236 test.equal(this.restore.callCount, 1);237 test.done();238 });239 },240};241exports['Tessel (t2: version)'] = {242 setUp(done) {243 this.sandbox = sinon.sandbox.create();244 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');245 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');246 this.error = this.sandbox.stub(log, 'error');247 this.warn = this.sandbox.stub(log, 'warn');248 this.envVersions = this.sandbox.stub(controller, 'envVersions').returns(Promise.resolve());249 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');250 this.processExit = this.sandbox.stub(process, 'exit');251 done();252 },253 tearDown(done) {254 this.sandbox.restore();255 done();256 },257 noError(test) {258 test.expect(1);259 t2(['version']);260 setImmediate(() => {261 test.equal(this.envVersions.callCount, 1);262 test.done();263 });264 },265};266exports['Tessel (t2: rename)'] = {267 setUp(done) {268 this.sandbox = sinon.sandbox.create();269 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');270 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');271 this.error = this.sandbox.stub(log, 'error');272 this.warn = this.sandbox.stub(log, 'warn');273 this.rename = this.sandbox.stub(controller, 'rename').returns(Promise.resolve());274 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');275 this.processExit = this.sandbox.stub(process, 'exit');276 done();277 },278 tearDown(done) {279 this.sandbox.restore();280 done();281 },282 noError(test) {283 test.expect(1);284 t2(['rename']);285 setImmediate(() => {286 test.equal(this.rename.callCount, 1);287 test.done();288 });289 },290};291exports['Tessel (t2: key)'] = {292 setUp(done) {293 this.sandbox = sinon.sandbox.create();294 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');295 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');296 this.error = this.sandbox.stub(log, 'error');297 this.warn = this.sandbox.stub(log, 'warn');298 this.setupLocal = this.sandbox.stub(controller, 'setupLocal').returns(Promise.resolve());299 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');300 this.processExit = this.sandbox.stub(process, 'exit');301 done();302 },303 tearDown(done) {304 this.sandbox.restore();305 done();306 },307 noError(test) {308 test.expect(1);309 t2(['key', '--generate=1']);310 setImmediate(() => {311 test.equal(this.setupLocal.callCount, 1);312 test.done();313 });314 },315};316exports['Tessel (t2: ap)'] = {317 setUp(done) {318 this.sandbox = sinon.sandbox.create();319 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');320 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');321 this.error = this.sandbox.stub(log, 'error');322 this.warn = this.sandbox.stub(log, 'warn');323 this.enableAccessPoint = this.sandbox.stub(controller, 'enableAccessPoint')324 .returns(Promise.resolve());325 this.disableAccessPoint = this.sandbox.stub(controller, 'disableAccessPoint')326 .returns(Promise.resolve());327 this.createAccessPoint = this.sandbox.stub(controller, 'createAccessPoint')328 .returns(Promise.resolve());329 this.getAccessPointInfo = this.sandbox.stub(controller, 'getAccessPointInfo')330 .returns(Promise.resolve());331 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');332 this.processExit = this.sandbox.stub(process, 'exit');333 done();334 },335 tearDown(done) {336 this.sandbox.restore();337 done();338 },339 onNoError(test) {340 test.expect(1);341 t2(['ap', '--on']);342 setImmediate(() => {343 test.equal(this.enableAccessPoint.callCount, 1);344 test.done();345 });346 },347 offNoError(test) {348 test.expect(1);349 t2(['ap', '--off']);350 setImmediate(() => {351 test.equal(this.disableAccessPoint.callCount, 1);352 test.done();353 });354 },355 ssidNoError(test) {356 test.expect(1);357 t2(['ap', '--ssid=foo']);358 setImmediate(() => {359 test.equal(this.createAccessPoint.callCount, 1);360 test.done();361 });362 },363 requestSSIDNoError(test) {364 test.expect(1);365 t2(['ap']);366 setImmediate(() => {367 test.equal(this.getAccessPointInfo.callCount, 1);368 test.done();369 });370 },371};372exports['Tessel (t2: provision)'] = {373 setUp(done) {374 this.sandbox = sinon.sandbox.create();375 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');376 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');377 this.error = this.sandbox.stub(log, 'error');378 this.warn = this.sandbox.stub(log, 'warn');379 this.info = this.sandbox.stub(log, 'info');380 this.provision = this.sandbox.stub(controller, 'provision').returns(Promise.resolve());381 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');382 this.processExit = this.sandbox.stub(process, 'exit');383 done();384 },385 tearDown(done) {386 this.sandbox.restore();387 done();388 },389 noError(test) {390 test.expect(1);391 t2(['provision']);392 // We must wait for the command to complete393 // or else the sandbox will be cleared to early394 setImmediate(() => {395 test.equal(this.provision.callCount, 1);396 test.done();397 });398 },399 exitCodeOne(test) {400 test.expect(4);401 var error = new Error('Some error happened.');402 var provisionOp = Promise.reject(error);403 this.provision.returns(provisionOp);404 t2(['provision']);405 provisionOp.catch(() => {406 test.equal(this.provision.callCount, 1);407 test.equal(this.closeFailedCommand.callCount, 1);408 test.equal(this.closeFailedCommand.lastCall.args[0], error);409 test.equal(this.processExit.lastCall.args[0], 1);410 test.done();411 });412 },413};414exports['Tessel (t2: reboot)'] = {415 setUp(done) {416 this.sandbox = sinon.sandbox.create();417 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');418 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');419 this.error = this.sandbox.stub(log, 'error');420 this.warn = this.sandbox.stub(log, 'warn');421 this.info = this.sandbox.stub(log, 'info');422 this.reboot = this.sandbox.stub(controller, 'reboot').returns(Promise.resolve());423 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');424 this.processExit = this.sandbox.stub(process, 'exit');425 done();426 },427 tearDown(done) {428 this.sandbox.restore();429 done();430 },431 noError(test) {432 test.expect(1);433 t2(['reboot']);434 // We must wait for the command to complete435 // or else the sandbox will be cleared to early436 setImmediate(() => {437 test.equal(this.reboot.callCount, 1);438 test.done();439 });440 },441};442exports['Tessel (t2: erase)'] = {443 setUp(done) {444 this.sandbox = sinon.sandbox.create();445 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');446 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');447 this.error = this.sandbox.stub(log, 'error');448 this.warn = this.sandbox.stub(log, 'warn');449 this.info = this.sandbox.stub(log, 'info');450 this.eraseScript = this.sandbox.stub(controller, 'eraseScript').returns(Promise.resolve());451 this.closeFailedCommand = this.sandbox.spy(t2, 'closeFailedCommand');452 this.processExit = this.sandbox.stub(process, 'exit');453 done();454 },455 tearDown(done) {456 this.sandbox.restore();457 done();458 },459 noError(test) {460 test.expect(1);461 t2(['erase']);462 // We must wait for the command to complete463 // or else the sandbox will be cleared to early464 setImmediate(() => {465 test.equal(this.eraseScript.callCount, 1);466 test.done();467 });468 },469};470exports['Tessel (t2: wifi)'] = {471 setUp(done) {472 this.sandbox = sinon.sandbox.create();473 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');474 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');475 this.warn = this.sandbox.stub(log, 'warn');476 this.info = this.sandbox.stub(log, 'info');477 this.printAvailableNetworks = this.sandbox.stub(controller, 'printAvailableNetworks').returns(Promise.resolve());478 this.connectToNetwork = this.sandbox.stub(controller, 'connectToNetwork').returns(Promise.resolve());479 this.getWifiInfo = this.sandbox.stub(controller, 'getWifiInfo').returns(Promise.resolve());480 this.successfulCommand = this.sandbox.stub(t2, 'closeSuccessfulCommand');481 this.failedCommand = this.sandbox.stub(t2, 'closeFailedCommand');482 done();483 },484 tearDown(done) {485 this.sandbox.restore();486 done();487 },488 noOpts(test) {489 test.expect(3);490 t2(['wifi']);491 // We should not call either of these functions if no args were passed492 test.equal(this.printAvailableNetworks.callCount, 0);493 test.equal(this.connectToNetwork.callCount, 0);494 // It should call the getWiFiInfo function495 test.equal(this.getWifiInfo.callCount, 1);496 test.done();497 },498 listNoError(test) {499 test.expect(1);500 var resolve = Promise.resolve();501 this.printAvailableNetworks.returns(resolve);502 t2(['wifi', '--list']);503 resolve.then(() => {504 test.equal(this.successfulCommand.callCount, 1);505 test.done();506 });507 },508 offNoError(test) {509 test.expect(2);510 var resolve = Promise.resolve();511 this.printAvailableNetworks.returns(resolve);512 this.setWiFiState = this.sandbox.stub(controller, 'setWiFiState').returns(Promise.resolve());513 t2(['wifi', '--off']);514 resolve.then(() => {515 test.equal(this.setWiFiState.callCount, 1);516 test.equal(this.successfulCommand.callCount, 1);517 test.done();518 });519 },520 onNoError(test) {521 test.expect(2);522 var resolve = Promise.resolve();523 this.printAvailableNetworks.returns(resolve);524 this.setWiFiState = this.sandbox.stub(controller, 'setWiFiState').returns(Promise.resolve());525 t2(['wifi', '--on']);526 resolve.then(() => {527 test.equal(this.setWiFiState.callCount, 1);528 test.equal(this.successfulCommand.callCount, 1);529 test.done();530 });531 },532 listErrorExitCodeOne(test) {533 test.expect(1);534 var reject = Promise.reject();535 this.printAvailableNetworks.returns(reject);536 t2(['wifi', '--list']);537 reject.catch(() => {538 throw 'Without this, the catch in the test is invoked before the catch in the cli program.';539 }).catch(() => {540 test.equal(this.failedCommand.callCount, 1);541 test.done();542 });543 },544 ssidPassNoError(test) {545 test.expect(1);546 var resolve = Promise.resolve();547 this.connectToNetwork.returns(resolve);548 t2(['wifi', '--ssid', 'a', '--password', 'b']);549 resolve.then(() => {550 test.equal(this.successfulCommand.callCount, 1);551 test.done();552 });553 },554 ssidPassErrorExitCodeOne(test) {555 test.expect(1);556 var reject = Promise.reject();557 this.connectToNetwork.returns(reject);558 t2(['wifi', '--ssid', 'a', '--password', 'b']);559 reject.catch(() => {560 throw 'Without this, the catch in the test is invoked before the catch in the cli program.';561 }).catch(() => {562 test.equal(this.failedCommand.callCount, 1);563 test.done();564 });565 },566};567exports['Tessel (t2: root)'] = {568 setUp(done) {569 this.sandbox = sinon.sandbox.create();570 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');571 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');572 this.warn = this.sandbox.stub(log, 'warn');573 this.info = this.sandbox.stub(log, 'info');574 this.root = this.sandbox.stub(controller, 'root').returns(Promise.resolve());575 this.successfulCommand = this.sandbox.stub(t2, 'closeSuccessfulCommand');576 done();577 },578 tearDown(done) {579 this.sandbox.restore();580 done();581 },582 callThrough(test) {583 test.expect(2);584 var resolve = Promise.resolve();585 this.root.returns(resolve);586 t2(['root']);587 resolve.then(() => {588 test.equal(this.root.callCount, 1);589 test.equal(this.successfulCommand.callCount, 1);590 test.done();591 });592 },593};594exports['Tessel (t2: run)'] = {595 setUp(done) {596 this.sandbox = sinon.sandbox.create();597 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');598 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');599 this.warn = this.sandbox.stub(log, 'warn');600 this.info = this.sandbox.stub(log, 'info');601 this.deploy = this.sandbox.stub(controller, 'deploy').returns(Promise.resolve());602 this.successfulCommand = this.sandbox.stub(t2, 'closeSuccessfulCommand');603 done();604 },605 tearDown(done) {606 this.sandbox.restore();607 done();608 },609 defaultOptions(test) {610 test.expect(6);611 t2(['run', 'index.js']);612 test.equal(this.deploy.callCount, 1);613 var args = this.deploy.lastCall.args[0];614 // These represent the minimum required properties615 // and default values for `t2 run index.js`616 test.equal(args.slim, true);617 test.equal(args.lanPrefer, false);618 test.equal(args.full, false);619 test.equal(args.push, false);620 test.ok(!args.rustcc);621 setImmediate(test.done);622 },623 fullSetTrue_slimOverriddenLater(test) {624 test.expect(5);625 t2(['run', 'index.js', '--full=true']);626 test.equal(this.deploy.callCount, 1);627 var args = this.deploy.lastCall.args[0];628 // opts.full will override opts.slim in `tarBundle`629 // (See test/unit/deploy.js)630 test.equal(args.full, true);631 test.equal(args.slim, true);632 test.equal(args.lanPrefer, false);633 test.ok(!args.push);634 setImmediate(test.done);635 },636 binopts(test) {637 test.expect(3);638 t2(['run', 'index.js', '--binopts="--a"']);639 test.equal(this.deploy.callCount, 1);640 var args = this.deploy.lastCall.args[0];641 test.deepEqual(args.binopts, ['--a']);642 test.ok(!args.push);643 setImmediate(test.done);644 },645 binoptsList(test) {646 test.expect(3);647 t2(['run', 'index.js', '--binopts=--a,--b,--c']);648 test.equal(this.deploy.callCount, 1);649 var args = this.deploy.lastCall.args[0];650 test.deepEqual(args.binopts, ['--a', '--b', '--c']);651 test.ok(!args.push);652 setImmediate(test.done);653 },654};655exports['Tessel (t2: push)'] = {656 setUp(done) {657 this.sandbox = sinon.sandbox.create();658 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');659 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');660 this.warn = this.sandbox.stub(log, 'warn');661 this.info = this.sandbox.stub(log, 'info');662 this.deploy = this.sandbox.stub(controller, 'deploy').returns(Promise.resolve());663 this.successfulCommand = this.sandbox.stub(t2, 'closeSuccessfulCommand');664 done();665 },666 tearDown(done) {667 this.sandbox.restore();668 done();669 },670 defaultOptions(test) {671 test.expect(6);672 t2(['push', 'index.js']);673 test.equal(this.deploy.callCount, 1);674 var args = this.deploy.lastCall.args[0];675 // These represent the minimum required properties676 // and default values for `t2 push index.js`677 test.ok(args.lanPrefer);678 test.ok(args.slim);679 test.ok(args.push);680 test.ok(!args.full);681 test.ok(!args.rustcc);682 setImmediate(test.done);683 },684 fullSetTrue_slimOverriddenLater(test) {685 test.expect(5);686 t2(['push', 'index.js', '--full=true']);687 test.equal(this.deploy.callCount, 1);688 var args = this.deploy.lastCall.args[0];689 // opts.full will override opts.slim in `tarBundle`690 // (See test/unit/deploy.js)691 test.ok(args.full);692 test.ok(args.lanPrefer);693 test.ok(args.push);694 test.ok(args.slim);695 setImmediate(test.done);696 },697 binopts(test) {698 test.expect(3);699 t2(['push', 'index.js', '--binopts="--a"']);700 test.equal(this.deploy.callCount, 1);701 var args = this.deploy.lastCall.args[0];702 test.deepEqual(args.binopts, ['--a']);703 test.ok(args.push);704 setImmediate(test.done);705 },706 binoptsList(test) {707 test.expect(3);708 t2(['push', 'index.js', '--binopts=--a,--b,--c']);709 test.equal(this.deploy.callCount, 1);710 var args = this.deploy.lastCall.args[0];711 test.deepEqual(args.binopts, ['--a', '--b', '--c']);712 test.ok(args.push);713 setImmediate(test.done);714 },715};716exports['Tessel (t2: list)'] = {717 setUp(done) {718 this.sandbox = sinon.sandbox.create();719 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');720 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');721 this.warn = this.sandbox.stub(log, 'warn');722 this.info = this.sandbox.stub(log, 'info');723 this.controllerList = this.sandbox.spy(controller, 'listTessels');724 this.tesselList = this.sandbox.stub(Tessel, 'list').returns(Promise.resolve());725 this.setDefaultKey = this.sandbox.spy(provision, 'setDefaultKey');726 this.processExit = this.sandbox.stub(process, 'exit');727 this.closeSuccessful = this.sandbox.stub(t2, 'closeSuccessfulCommand');728 this.closeFailed = this.sandbox.stub(t2, 'closeFailedCommand');729 done();730 },731 tearDown(done) {732 this.sandbox.restore();733 done();734 },735 listStandard(test) {736 test.expect(4);737 t2(['list', '--timeout', '0.001']);738 setImmediate(() => {739 // Ensure controller list was called740 test.ok(this.controllerList.calledOnce);741 // Ensure it did not have a key option742 test.ok(this.controllerList.lastCall.args[0].key === undefined);743 // We should not try to set the keypath if not specifically requested744 test.ok(!this.setDefaultKey.called);745 // Tessel list should have been called afterwards746 test.ok(this.tesselList.called);747 test.done();748 });749 },750 listKey(test) {751 test.expect(4);752 var keyPath = './FAKE_KEY';753 t2(['list', '--timeout', '0.001', '-i', keyPath]);754 setImmediate(() => {755 // Restore our func so other tests pass756 // Ensure list was called757 test.ok(this.controllerList.calledOnce);758 // It was called with the keypath759 test.ok(this.controllerList.lastCall.args[0].key === keyPath);760 // We did try to set the key path761 test.ok(this.setDefaultKey.called);762 // It was called with the key path763 test.ok(this.setDefaultKey.lastCall.args[0] === keyPath);764 test.done();765 });766 }767};768exports['closeFailedCommand'] = {769 setUp(done) {770 this.sandbox = sinon.sandbox.create();771 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');772 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');773 this.error = this.sandbox.stub(log, 'error');774 this.warn = this.sandbox.stub(log, 'warn');775 this.processExit = this.sandbox.stub(process, 'exit');776 done();777 },778 tearDown(done) {779 this.sandbox.restore();780 done();781 },782 warningJustAString(test) {783 test.expect(3);784 t2.closeFailedCommand('a string');785 test.equal(this.warn.callCount, 1);786 test.equal(this.warn.lastCall.args[0], 'a string');787 test.equal(this.processExit.callCount, 1);788 test.done();789 },790 errorIsAnErrorObject(test) {791 test.expect(3);792 var error = new Error('for real');793 t2.closeFailedCommand(error);794 test.equal(this.error.callCount, 1);795 test.equal(this.error.lastCall.args[0], error.toString());796 test.equal(this.processExit.callCount, 1);797 test.done();798 },799 errorCode(test) {800 test.expect(4);801 var error = new Error('for real');802 error.code = 'red';803 t2.closeFailedCommand(error);804 test.equal(this.error.callCount, 1);805 test.equal(this.error.lastCall.args[0], error.toString());806 test.equal(this.processExit.callCount, 1);807 test.equal(this.processExit.lastCall.args[0], 'red');808 test.done();809 },810 errorCodeInOptions(test) {811 test.expect(4);812 var error = new Error('for real');813 t2.closeFailedCommand(error, {814 code: 'red'815 });816 test.equal(this.error.callCount, 1);817 test.equal(this.error.lastCall.args[0], error.toString());818 test.equal(this.processExit.callCount, 1);819 test.equal(this.processExit.lastCall.args[0], 'red');820 test.done();821 },822};823exports['--output true/false'] = {824 setUp(done) {825 this.sandbox = sinon.sandbox.create();826 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');827 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');828 // console.error is used by the underlying log.info/error/warn calls829 this.info = this.sandbox.stub(log, 'info');830 this.error = this.sandbox.stub(log, 'error');831 this.controllerList = this.sandbox.spy(controller, 'listTessels');832 this.tesselList = this.sandbox.stub(Tessel, 'list').callsFake(() => {833 // Simulating what actually happens in Tessel.list834 // without the complexity of mocking a seeker835 log.info('Searching for devices...');836 return Promise.reject('No devices found...');837 });838 this.outputHelper = this.sandbox.spy(controller, 'outputHelper');839 this.processExit = this.sandbox.stub(process, 'exit');840 this.closeSuccessful = this.sandbox.stub(t2, 'closeSuccessfulCommand');841 this.closeFailed = this.sandbox.stub(t2, 'closeFailedCommand');842 done();843 },844 tearDown(done) {845 this.sandbox.restore();846 done();847 },848 defaultOutputTrue(test) {849 test.expect(5);850 t2(['list', '--timeout', '0.001']);851 setImmediate(() => {852 // Ensure list was called853 test.ok(this.controllerList.calledOnce);854 // We did try to set the output855 test.ok(this.outputHelper.calledOnce);856 // It was called proper flag (default is true)857 test.ok(this.outputHelper.lastCall.args[0].output === true);858 // Ensure we called Tessel List859 test.ok(this.tesselList.calledOnce);860 // log was called once at the start to indicate we're searching861 test.equal(this.info.callCount, 1);862 test.done();863 });864 },865 outputFalse(test) {866 test.expect(5);867 t2(['list', '--timeout', '0.001', '--output=false']);868 setImmediate(() => {869 // Restore our func so other tests pass870 // Ensure list was called871 test.ok(this.controllerList.calledOnce);872 // We did try to set the output873 test.ok(this.outputHelper.calledOnce);874 // It was called proper flag (default is true)875 test.ok(this.outputHelper.lastCall.args[0].output === false);876 // Ensure we called Tessel List877 test.ok(this.tesselList.calledOnce);878 // log was never called because we disabled it879 test.equal(this.error.callCount, 0);880 test.done();881 });882 },883};884exports['Tessel (t2: crash-reporter)'] = {885 setUp(done) {886 this.sandbox = sinon.sandbox.create();887 this.spinnerStart = this.sandbox.stub(log.spinner, 'start');888 this.spinnerStop = this.sandbox.stub(log.spinner, 'stop');889 this.warn = this.sandbox.stub(log, 'warn');890 this.info = this.sandbox.stub(log, 'info');891 this.closeSuccessful = this.sandbox.stub(t2, 'closeSuccessfulCommand');892 this.closeFailed = this.sandbox.stub(t2, 'closeFailedCommand');893 this.crOn = this.sandbox.stub(CrashReporter, 'on').returns(Promise.resolve());894 this.crOff = this.sandbox.stub(CrashReporter, 'off').returns(Promise.resolve());895 this.crPost = this.sandbox.stub(CrashReporter, 'post').returns(Promise.resolve());896 this.crStatus = this.sandbox.stub(CrashReporter, 'status').returns(Promise.resolve());897 this.crSubmit = this.sandbox.stub(CrashReporter, 'submit').returns(Promise.resolve());898 this.crTest = this.sandbox.stub(CrashReporter, 'test').returns(Promise.resolve());899 done();900 },901 tearDown(done) {902 this.sandbox.restore();903 done();904 },905 callThroughNoOptions(test) {906 test.expect(4);907 var resolve = Promise.resolve();908 this.crStatus.restore();909 this.crStatus = this.sandbox.stub(CrashReporter, 'status').returns(resolve);910 t2(['crash-reporter']);911 test.equal(this.crOn.callCount, 0);912 test.equal(this.crOff.callCount, 0);913 test.equal(this.crTest.callCount, 0);914 resolve.then(() => {915 test.equal(this.crStatus.callCount, 1);916 test.done();917 });918 },919 on(test) {920 test.expect(4);921 t2(['crash-reporter', '--on=true']);922 test.equal(this.crOn.callCount, 1);923 test.equal(this.crOff.callCount, 0);924 test.equal(this.crTest.callCount, 0);925 test.equal(this.crStatus.callCount, 0);926 test.done();927 },928 off(test) {929 test.expect(4);930 t2(['crash-reporter', '--off=true']);931 test.equal(this.crOn.callCount, 0);932 test.equal(this.crOff.callCount, 1);933 test.equal(this.crTest.callCount, 0);934 test.equal(this.crStatus.callCount, 0);935 test.done();936 },937 test(test) {938 test.expect(4);939 var resolve = Promise.resolve();940 this.crTest.restore();941 this.crTest = this.sandbox.stub(CrashReporter, 'test').returns(resolve);942 t2(['crash-reporter', '--test=true']);943 test.equal(this.crOn.callCount, 0);944 test.equal(this.crOff.callCount, 0);945 test.equal(this.crStatus.callCount, 0);946 resolve.then(() => {947 test.equal(this.crTest.callCount, 1);948 test.done();949 });950 },951 onAndTest(test) {952 test.expect(4);953 var resolve = Promise.resolve();954 this.crOn.restore();955 this.crOn = this.sandbox.stub(CrashReporter, 'on').returns(resolve);956 t2(['crash-reporter', '--on', '--test']);957 resolve.then(() => {958 test.equal(this.crOn.callCount, 1);959 test.equal(this.crOff.callCount, 0);960 test.equal(this.crTest.callCount, 1);961 test.equal(this.crStatus.callCount, 0);962 test.done();963 });964 },965 onNoTestThrough(test) {966 test.expect(4);967 var resolve = Promise.resolve();968 this.crOn.restore();969 this.crOn = this.sandbox.stub(CrashReporter, 'on').returns(resolve);970 t2(['crash-reporter', '--on']);971 resolve.then(() => {972 test.equal(this.crOn.callCount, 1);973 test.equal(this.crOff.callCount, 0);974 test.equal(this.crTest.callCount, 0);975 test.equal(this.crStatus.callCount, 1);976 test.done();977 });978 },979 unsuccessful(test) {980 test.expect(4);981 var resolve = Promise.resolve();982 this.crOn.restore();983 this.crOn = this.sandbox.stub(CrashReporter, 'on').returns(resolve);984 t2(['crash-reporter', '--on']);985 resolve.then(() => {986 test.equal(this.crOn.callCount, 1);987 test.equal(this.crOff.callCount, 0);988 test.equal(this.crTest.callCount, 0);989 test.equal(this.crStatus.callCount, 1);990 test.done();991 });992 },993};994exports['Tessel (init)'] = {995 setUp(done) {996 this.sandbox = sinon.sandbox.create();997 this.warn = this.sandbox.stub(log, 'warn');998 this.info = this.sandbox.stub(log, 'info');999 this.successfulCommand = this.sandbox.stub(t2, 'closeSuccessfulCommand');1000 this.failedCommand = this.sandbox.stub(t2, 'closeFailedCommand');1001 this.resolveLanguage = this.sandbox.spy(init, 'resolveLanguage');1002 done();1003 },1004 tearDown(done) {1005 this.sandbox.restore();1006 done();1007 },1008 'defaults to --lang=js' (test) {1009 test.expect(3);1010 var resolve = Promise.resolve();1011 this.createNewProject = this.sandbox.stub(controller, 'createNewProject').returns(resolve);1012 t2(['init']);1013 resolve.then(() => {1014 // Infers that the stub above called and not the actual createNewProject1015 test.equal(this.resolveLanguage.callCount, 0);1016 test.equal(this.createNewProject.callCount, 1);1017 test.equal(this.createNewProject.lastCall.args[0].lang, 'js');1018 test.done();1019 });1020 },1021 'explicit --lang=js' (test) {1022 test.expect(3);1023 var resolve = Promise.resolve();1024 this.createNewProject = this.sandbox.stub(controller, 'createNewProject').returns(resolve);1025 t2(['init', '--lang=js']);1026 resolve.then(() => {1027 // Infers that the stub above called and not the actual createNewProject1028 test.equal(this.resolveLanguage.callCount, 0);1029 test.equal(this.createNewProject.callCount, 1);1030 test.equal(this.createNewProject.lastCall.args[0].lang, 'js');1031 test.done();1032 });1033 },1034 'explicit --lang=javascript' (test) {1035 test.expect(3);1036 var resolve = Promise.resolve();1037 this.createNewProject = this.sandbox.stub(controller, 'createNewProject').returns(resolve);1038 t2(['init', '--lang=javascript']);1039 resolve.then(() => {1040 // Infers that the stub above called and not the actual createNewProject1041 test.equal(this.resolveLanguage.callCount, 0);1042 test.equal(this.createNewProject.callCount, 1);1043 test.equal(this.createNewProject.lastCall.args[0].lang, 'javascript');1044 test.done();1045 });1046 },1047 'explicit --lang=rs' (test) {1048 test.expect(3);1049 var resolve = Promise.resolve();1050 this.createNewProject = this.sandbox.stub(controller, 'createNewProject').returns(resolve);1051 t2(['init', '--lang=rs']);1052 resolve.then(() => {1053 // Infers that the stub above called and not the actual createNewProject1054 test.equal(this.resolveLanguage.callCount, 0);1055 test.equal(this.createNewProject.callCount, 1);1056 test.equal(this.createNewProject.lastCall.args[0].lang, 'rs');1057 test.done();1058 });1059 },1060 'explicit --lang=rust' (test) {1061 test.expect(3);1062 var resolve = Promise.resolve();1063 this.createNewProject = this.sandbox.stub(controller, 'createNewProject').returns(resolve);1064 t2(['init', '--lang=rust']);1065 resolve.then(() => {1066 // Infers that the stub above called and not the actual createNewProject1067 test.equal(this.resolveLanguage.callCount, 0);1068