Bläddra i källkod

Merge branch 'master' of https://github.com/katzer/cordova-plugin-local-notifications

PKnittel 11 år sedan
förälder
incheckning
ed78cdfb21

+ 1 - 0
plugin.xml

@@ -21,6 +21,7 @@
     <dependency id="org.apache.cordova.device" url="https://github.com/apache/cordova-plugin-device" />
 
     <js-module src="www/local-notification.js" name="LocalNotification">
+        <clobbers target="cordova.plugins.notification.local" />
         <clobbers target="plugin.notification.local" />
     </js-module>
 

+ 19 - 8
src/ios/APPLocalNotification.h

@@ -26,6 +26,12 @@
 
 // Execute all queued events
 - (void) deviceready:(CDVInvokedUrlCommand*)command;
+
+// Inform if the app has the permission to show notifications
+- (void) hasPermission:(CDVInvokedUrlCommand*)command;
+// Register permission to show notifications
+- (void) registerPermission:(CDVInvokedUrlCommand*)command;
+
 // Schedule a new notification
 - (void) add:(CDVInvokedUrlCommand*)command;
 // Update a notification
@@ -34,21 +40,26 @@
 - (void) cancel:(CDVInvokedUrlCommand*)command;
 // Cancel all currently scheduled notifications
 - (void) cancelAll:(CDVInvokedUrlCommand*)command;
-// Check if a notification with an ID is scheduled
+
+// If a notification with an ID exists
+- (void) exist:(CDVInvokedUrlCommand*)command;
+// If a notification with an ID was scheduled
 - (void) isScheduled:(CDVInvokedUrlCommand*)command;
-// Check if a notification with an ID was triggered
+// If a notification with an ID was triggered
 - (void) isTriggered:(CDVInvokedUrlCommand*)command;
+
+// List all ids from all local notifications
+- (void) getAllIds:(CDVInvokedUrlCommand*)command;
 // List all ids from all pending notifications
 - (void) getScheduledIds:(CDVInvokedUrlCommand*)command;
 // List all ids from all triggered notifications
 - (void) getTriggeredIds:(CDVInvokedUrlCommand*)command;
-// List all properties for given scheduled notifications
+
+// Property list for given local notifications
+- (void) getAll:(CDVInvokedUrlCommand*)command;
+// Property list for given scheduled notifications
 - (void) getScheduled:(CDVInvokedUrlCommand*)command;
-// List all properties for given triggered notifications
+// Property list for given triggered notifications
 - (void) getTriggered:(CDVInvokedUrlCommand*)command;
-// Inform if the app has the permission to show notifications
-- (void) hasPermission:(CDVInvokedUrlCommand*)command;
-// Register permission to show notifications
-- (void) registerPermission:(CDVInvokedUrlCommand*)command;
 
 @end

+ 83 - 3
src/ios/APPLocalNotification.m

@@ -161,6 +161,34 @@
     }];
 }
 
+/**
+ * If a notification by ID exists.
+ *
+ * @param id
+ *      The ID of the notification
+ */
+- (void) exist:(CDVInvokedUrlCommand *)command
+{
+    [self.commandDelegate runInBackground:^{
+        NSString* id = [[command arguments]
+                        objectAtIndex:0];
+
+        CDVPluginResult* result;
+        UILocalNotification* notification;
+
+        notification = [[UIApplication sharedApplication]
+                        localNotificationWithId:id];
+
+        bool exists = notification != NULL;
+
+        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
+                                     messageAsBool:exists];
+
+        [self.commandDelegate sendPluginResult:result
+                                    callbackId:command.callbackId];
+    }];
+}
+
 /**
  * If a notification by ID is scheduled.
  *
@@ -217,6 +245,26 @@
     }];
 }
 
+/**
+ * List all ids from all local notifications.
+ */
+- (void) getAllIds:(CDVInvokedUrlCommand*)command
+{
+    [self.commandDelegate runInBackground:^{
+        CDVPluginResult* result;
+        NSArray* notIds;
+
+        notIds = [[UIApplication sharedApplication]
+                  localNotificationIds];
+
+        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
+                                    messageAsArray:notIds];
+
+        [self.commandDelegate sendPluginResult:result
+                                    callbackId:command.callbackId];
+    }];
+}
+
 /**
  * List all ids from all pending notifications.
  */
@@ -258,7 +306,36 @@
 }
 
 /**
- * List all properties for given scheduled notifications.
+ * Property list for given local notifications.
+ *
+ * @param ids
+ *      The IDs of the notifications
+ */
+- (void) getAll:(CDVInvokedUrlCommand*)command
+{
+    [self.commandDelegate runInBackground:^{
+        NSArray* ids = command.arguments;
+        NSArray* notifications;
+        CDVPluginResult* result;
+
+        if (ids.count == 0) {
+            notifications = [[UIApplication sharedApplication]
+                             localNotificationOptions];
+        } else {
+            notifications = [[UIApplication sharedApplication]
+                             localNotificationOptions:ids];
+        }
+
+        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
+                                    messageAsArray:notifications];
+
+        [self.commandDelegate sendPluginResult:result
+                                    callbackId:command.callbackId];
+    }];
+}
+
+/**
+ * Property list for given scheduled notifications.
  *
  * @param ids
  *      The IDs of the notifications
@@ -287,7 +364,7 @@
 }
 
 /**
- * List all properties for given triggered notifications.
+ * Property list for given triggered notifications.
  *
  * @param ids
  *      The IDs of the notifications
@@ -604,13 +681,16 @@
         NSString* json = notification.options.json;
         NSString* args = [notification encodeToJSON];
 
+        json = [json stringByReplacingOccurrencesOfString:@"'"
+                                               withString:@"\\\\\\'"];
+
         params = [NSString stringWithFormat:
                   @"\"%@\",\"%@\",\\'%@\\',JSON.parse(\\'%@\\')",
                   id, self.applicationState, json, args];
     }
 
     js = [NSString stringWithFormat:
-          @"setTimeout('plugin.notification.local.on%@(%@)',0)",
+          @"setTimeout('cordova.plugins.notification.local.on%@(%@)',0)",
           event, params];
 
     if (deviceready) {

+ 20 - 7
src/ios/UIApplication+APPLocalNotification.h

@@ -21,7 +21,11 @@
 
 @interface UIApplication (APPLocalNotification)
 
+@property (readonly, getter=localNotifications) NSArray* localNotifications;
+@property (readonly, getter=scheduledLocalNotifications2) NSArray* triggeredLocalNotifications2;
 @property (readonly, getter=triggeredLocalNotifications) NSArray* triggeredLocalNotifications;
+
+@property (readonly, getter=localNotificationIds) NSArray* localNotificationIds;
 @property (readonly, getter=triggeredLocalNotificationIds) NSArray* triggeredLocalNotificationIds;
 @property (readonly, getter=scheduledLocalNotificationIds) NSArray* scheduledLocalNotificationIds;
 
@@ -29,17 +33,26 @@
 - (BOOL) hasPermissionToScheduleLocalNotifications;
 // Ask for permission to schedule local notifications
 - (void) registerPermissionToScheduleLocalNotifications;
-// Get the scheduled local notification by ID
+
+// Get local notification by ID
+- (UILocalNotification*) localNotificationWithId:(NSString*)id;
+// Get scheduled local notification by ID
 - (UILocalNotification*) scheduledLocalNotificationWithId:(NSString*)id;
-// Get the triggered local notification by ID
+// Get triggered local notification by ID
 - (UILocalNotification*) triggeredLocalNotificationWithId:(NSString*)id;
-// List of properties from all scheduled notifications
+
+// Property list from all local notifications
+- (NSArray*) localNotificationOptions;
+// Property list from all scheduled notifications
 - (NSArray*) scheduledLocalNotificationOptions;
-// List of properties from given scheduled notifications
-- (NSArray*) scheduledLocalNotificationOptions:(NSArray*)ids;
-// List of properties from all triggered notifications
+// Property list from all triggered notifications
 - (NSArray*) triggeredLocalNotificationOptions;
-// List of properties from given triggered notifications
+
+// Property list from given local notifications
+- (NSArray*) localNotificationOptions:(NSArray*)ids;
+// Property list from given scheduled notifications
+- (NSArray*) scheduledLocalNotificationOptions:(NSArray*)ids;
+// Property list from given triggered notifications
 - (NSArray*) triggeredLocalNotificationOptions:(NSArray*)ids;
 
 @end

+ 135 - 26
src/ios/UIApplication+APPLocalNotification.m

@@ -71,19 +71,56 @@
 #pragma mark -
 #pragma mark LocalNotifications
 
+/**
+ * List of all local notifications which have been added
+ * but not yet removed from the notification center.
+ */
+- (NSArray*) localNotifications
+{
+    NSArray* scheduledNotifications = self.scheduledLocalNotifications;
+    NSMutableArray* notifications = [[NSMutableArray alloc] init];
+
+    for (UILocalNotification* notification in scheduledNotifications)
+    {
+        if (notification) {
+            [notifications addObject:notification];
+        }
+    }
+
+    return notifications;
+}
+
+/**
+ * List of all local notifications which have been scheduled
+ * and not yet removed from the notification center.
+ */
+- (NSArray*) scheduledLocalNotifications2
+{
+    NSArray* scheduledNotifications = self.scheduledLocalNotifications;
+    NSMutableArray* notifications = [[NSMutableArray alloc] init];
+
+    for (UILocalNotification* notification in scheduledNotifications)
+    {
+        if (notification && [notification wasScheduled]) {
+            [notifications addObject:notification];
+        }
+    }
+
+    return notifications;
+}
+
 /**
  * List of all triggered local notifications which have been scheduled
  * and not yet removed the notification center.
  */
 - (NSArray*) triggeredLocalNotifications
 {
-    NSArray* scheduledNotifications = self.scheduledLocalNotifications;
+    NSArray* notifications = self.localNotifications;
     NSMutableArray* triggeredNotifications = [[NSMutableArray alloc] init];
 
-    for (UILocalNotification* notification in scheduledNotifications)
+    for (UILocalNotification* notification in notifications)
     {
-        if (notification && [notification wasTriggered])
-        {
+        if ([notification wasTriggered]) {
             [triggeredNotifications addObject:notification];
         }
     }
@@ -93,7 +130,24 @@
 
 /**
  * List of all triggered local notifications IDs which have been scheduled
- * and not yet removed the notification center.
+ * and not yet removed from the notification center.
+ */
+- (NSArray*) localNotificationIds
+{
+    NSArray* notifications = self.localNotifications;
+    NSMutableArray* ids = [[NSMutableArray alloc] init];
+
+    for (UILocalNotification* notification in notifications)
+    {
+        [ids addObject:notification.options.id];
+    }
+
+    return ids;
+}
+
+/**
+ * List of all added local notifications IDs which have been scheduled
+ * and not yet removed from the notification center.
  */
 - (NSArray*) triggeredLocalNotificationIds
 {
@@ -113,32 +167,50 @@
  */
 - (NSArray*) scheduledLocalNotificationIds
 {
-    NSArray* notifications = self.scheduledLocalNotifications;
+    NSArray* notifications = self.scheduledLocalNotifications2;
     NSMutableArray* ids = [[NSMutableArray alloc] init];
 
     for (UILocalNotification* notification in notifications)
     {
-        if (notification) {
-            [ids addObject:notification.options.id];
-        }
+        [ids addObject:notification.options.id];
     }
 
     return ids;
 }
 
 /**
- * Get the scheduled local notification by ID.
+ * Get local notification by ID.
+ *
+ * @param id
+ *      Notification ID
+ */
+- (UILocalNotification*) localNotificationWithId:(NSString*)id
+{
+    NSArray* notifications = self.localNotifications;
+
+    for (UILocalNotification* notification in notifications)
+    {
+        if ([notification.options.id isEqualToString:id]) {
+            return notification;
+        }
+    }
+
+    return NULL;
+}
+
+/**
+ * Get scheduled local notification by ID.
  *
  * @param id
  *      Notification ID
  */
 - (UILocalNotification*) scheduledLocalNotificationWithId:(NSString*)id
 {
-    NSArray* notifications = self.scheduledLocalNotifications;
+    NSArray* notifications = self.scheduledLocalNotifications2;
 
     for (UILocalNotification* notification in notifications)
     {
-        if (notification && [notification.options.id isEqualToString:id]) {
+        if ([notification.options.id isEqualToString:id]) {
             return notification;
         }
     }
@@ -147,14 +219,14 @@
 }
 
 /**
- * Get the triggered local notification by ID.
+ * Get triggered local notification by ID.
  *
  * @param id
  *      Notification ID
  */
 - (UILocalNotification*) triggeredLocalNotificationWithId:(NSString*)id
 {
-    UILocalNotification* notification = [self scheduledLocalNotificationWithId:id];
+    UILocalNotification* notification = [self localNotificationWithId:id];
 
     if (notification && [notification wasTriggered]) {
         return notification;
@@ -163,38 +235,68 @@
     return NULL;
 }
 
+/**
+ * List of properties from all notifications.
+ */
+- (NSArray*) localNotificationOptions
+{
+    NSArray* notifications = self.localNotifications;
+    NSMutableArray* options = [[NSMutableArray alloc] init];
+
+    for (UILocalNotification* notification in notifications)
+    {
+        [options addObject:notification.userInfo];
+    }
+
+    return options;
+}
+
 /**
  * List of properties from all scheduled notifications.
  */
 - (NSArray*) scheduledLocalNotificationOptions
 {
-    NSArray* notifications = self.scheduledLocalNotifications;
+    NSArray* notifications = [self scheduledLocalNotifications2];
     NSMutableArray* options = [[NSMutableArray alloc] init];
 
     for (UILocalNotification* notification in notifications)
     {
-        if (notification) {
-            [options addObject:notification.userInfo];
-        }
+        [options addObject:notification.userInfo];
     }
 
     return options;
 }
 
 /**
- * List of properties from given scheduled notifications.
+ * List of properties from all triggered notifications.
+ */
+- (NSArray*) triggeredLocalNotificationOptions
+{
+    NSArray* notifications = self.triggeredLocalNotifications;
+    NSMutableArray* options = [[NSMutableArray alloc] init];
+
+    for (UILocalNotification* notification in notifications)
+    {
+        [options addObject:notification.userInfo];
+    }
+
+    return options;
+}
+
+/**
+ * List of properties from given local notifications.
  *
  * @param ids
  *      Notification IDs
  */
-- (NSArray*) scheduledLocalNotificationOptions:(NSArray*)ids
+- (NSArray*) localNotificationOptions:(NSArray*)ids
 {
     UILocalNotification* notification;
     NSMutableArray* options = [[NSMutableArray alloc] init];
 
     for (NSString* id in ids)
     {
-        notification = [self scheduledLocalNotificationWithId:id];
+        notification = [self localNotificationWithId:id];
 
         if (notification) {
             [options addObject:notification.userInfo];
@@ -205,16 +307,23 @@
 }
 
 /**
- * List of properties from all triggered notifications.
+ * List of properties from given scheduled notifications.
+ *
+ * @param ids
+ *      Notification IDs
  */
-- (NSArray*) triggeredLocalNotificationOptions
+- (NSArray*) scheduledLocalNotificationOptions:(NSArray*)ids
 {
-    NSArray* notifications = self.triggeredLocalNotifications;
+    UILocalNotification* notification;
     NSMutableArray* options = [[NSMutableArray alloc] init];
 
-    for (UILocalNotification* notification in notifications)
+    for (NSString* id in ids)
     {
-        [options addObject:notification.userInfo];
+        notification = [self scheduledLocalNotificationWithId:id];
+
+        if (notification) {
+            [options addObject:notification.userInfo];
+        }
     }
 
     return options;

+ 2 - 0
src/ios/UILocalNotification+APPLocalNotification.h

@@ -31,6 +31,8 @@
 - (double) timeIntervalSinceFireDate;
 // If the fire date was in the past
 - (BOOL) wasInThePast;
+// If the notification was already scheduled
+- (BOOL) wasScheduled;
 // If the notification was already triggered
 - (BOOL) wasTriggered;
 // If the notification was updated

+ 34 - 25
src/ios/UILocalNotification+APPLocalNotification.m

@@ -142,6 +142,32 @@ static char optionsKey;
     return timespan;
 }
 
+/**
+ * Encode the user info dict to JSON.
+ */
+- (NSString*) encodeToJSON
+{
+    NSString* json;
+    NSData* data;
+    NSMutableDictionary* obj = [self.userInfo mutableCopy];
+
+    [obj removeObjectForKey:@"json"];
+    [obj removeObjectForKey:@"updatedAt"];
+
+    data = [NSJSONSerialization dataWithJSONObject:obj
+                                           options:NSJSONWritingPrettyPrinted
+                                             error:Nil];
+
+    json = [[NSString alloc] initWithData:data
+                                 encoding:NSUTF8StringEncoding];
+
+    return [json stringByReplacingOccurrencesOfString:@"\n"
+                                           withString:@""];
+}
+
+#pragma mark -
+#pragma mark State
+
 /**
  * If the fire date was in the past.
  */
@@ -150,6 +176,12 @@ static char optionsKey;
     return [self timeIntervalSinceFireDate] > 0;
 }
 
+// If the notification was already scheduled
+- (BOOL) wasScheduled
+{
+    return [self isRepeating] || ![self wasInThePast];
+}
+
 /**
  * If the notification was already triggered.
  */
@@ -158,9 +190,9 @@ static char optionsKey;
     NSDate* now      = [NSDate date];
     NSDate* fireDate = self.fireDate;
 
-    bool isLaterThanOrEqualTo = !([now compare:fireDate] == NSOrderedAscending);
+    bool isLaterThanFireDate = !([now compare:fireDate] == NSOrderedAscending);
 
-    return isLaterThanOrEqualTo;
+    return isLaterThanFireDate;
 }
 
 /**
@@ -187,27 +219,4 @@ static char optionsKey;
     return [self.options isRepeating];
 }
 
-/**
- * Encode the user info dict to JSON.
- */
-- (NSString*) encodeToJSON
-{
-    NSString* json;
-    NSData* data;
-    NSMutableDictionary* obj = [self.userInfo mutableCopy];
-
-    [obj removeObjectForKey:@"json"];
-    [obj removeObjectForKey:@"updatedAt"];
-
-    data = [NSJSONSerialization dataWithJSONObject:obj
-                                           options:NSJSONWritingPrettyPrinted
-                                             error:Nil];
-
-    json = [[NSString alloc] initWithData:data
-                                 encoding:NSUTF8StringEncoding];
-
-    return [json stringByReplacingOccurrencesOfString:@"\n"
-                                           withString:@""];
-}
-
 @end

+ 138 - 19
www/local-notification.js

@@ -67,7 +67,8 @@ exports._defaults = {
     badge:      -1,
     id:         '0',
     json:       '',
-    repeat:     ''
+    repeat:     '',
+    date:       undefined
 };
 
 
@@ -159,7 +160,7 @@ exports.update = function (opts, callback, scope) {
 exports.clear = function (ids, callback, scope) {
     ids = Array.isArray(ids) ? ids : [ids];
 
-	ids = this.convertIds(ids);
+    ids = this.convertIds(ids);
 
     this.exec('clear', ids, callback, scope);
 };
@@ -207,6 +208,29 @@ exports.cancelAll = function (callback, scope) {
     this.exec('cancelAll', null, callback, scope);
 };
 
+/**
+ * Check if a notification with an ID exists.
+ *
+ * @param {String} id
+ *      The ID of the notification
+ * @param {Function} callback
+ *      A callback function to be called with the list
+ * @param {Object?} scope
+ *      The scope for the callback function
+ */
+exports.exist = function (id, callback, scope) {
+    var notId = (id || '0').toString();
+
+    this.exec('exist', notId, callback, scope);
+};
+
+/**
+ * Alias for `exist`.
+ */
+exports.exists = function () {
+    this.exist.apply(this, arguments);
+};
+
 /**
  * Check if a notification with an ID is scheduled.
  *
@@ -240,7 +264,26 @@ exports.isTriggered = function (id, callback, scope) {
 };
 
 /**
- * List all currently pending notifications.
+ * List all local notification IDs.
+ *
+ * @param {Function} callback
+ *      A callback function to be called with the list
+ * @param {Object?} scope
+ *      The scope for the callback function
+ */
+exports.getAllIds = function (callback, scope) {
+    this.exec('getAllIds', null, callback, scope);
+};
+
+/**
+ * Alias for `getAllIds`.
+ */
+exports.getIds = function () {
+    this.getAllIds.apply(this, arguments);
+};
+
+/**
+ * List all scheduled notification IDs.
  *
  * @param {Function} callback
  *      A callback function to be called with the list
@@ -252,7 +295,7 @@ exports.getScheduledIds = function (callback, scope) {
 };
 
 /**
- * List all triggered notifications.
+ * List all triggered notification IDs.
  *
  * @param {Function} callback
  *      A callback function to be called with the list
@@ -264,7 +307,50 @@ exports.getTriggeredIds = function (callback, scope) {
 };
 
 /**
- * List all properties for given scheduled notifications.
+ * Property list for given local notifications.
+ * If called without IDs, all notification will be returned.
+ *
+ * @param {Number[]?} ids
+ *      Set of notification IDs
+ * @param {Function} callback
+ *      A callback function to be called with the list
+ * @param {Object?} scope
+ *      The scope for the callback function
+ */
+exports.get = function () {
+    var args = Array.apply(null, arguments);
+
+    if (typeof args[0] == 'function') {
+        args.unshift([]);
+    }
+
+    var ids      = args[0],
+        callback = args[1],
+        scope    = args[2];
+
+    if (!Array.isArray(ids)) {
+        ids = [ids];
+    }
+
+    ids = this.convertIds(ids);
+
+    this.exec('getAll', ids, callback, scope);
+};
+
+/**
+ * Property list for all local notifications.
+ *
+ * @param {Function} callback
+ *      A callback function to be called with the list
+ * @param {Object?} scope
+ *      The scope for the callback function
+ */
+exports.getAll = function (callback, scope) {
+    this.exec('getAll', null, callback, scope);
+};
+
+/**
+ * Property list for given scheduled notifications.
  * If called without IDs, all notification will be returned.
  *
  * @param {Number[]?} ids
@@ -307,7 +393,7 @@ exports.getAllScheduled = function (callback, scope) {
 };
 
 /**
- * List all properties for given triggered notifications.
+ * Property list for given triggered notifications.
  * If called without IDs, all notification will be returned.
  *
  * @param {Number[]?} ids
@@ -488,12 +574,22 @@ exports.onclear = function (id, state, json, data) {};
 exports.mergeWithDefaults = function (options) {
     var defaults = this.getDefaults();
 
+    options.date    = this.getValueFor(options, 'date', 'at', 'firstAt');
+    options.repeat  = this.getValueFor(options, 'repeat', 'every');
+    options.message = this.getValueFor(options, 'message', 'text');
+
     for (var key in defaults) {
-        if (options[key] === undefined) {
+        if (options[key] === null || options[key] === undefined) {
             options[key] = defaults[key];
         }
     }
 
+    for (key in options) {
+        if (!defaults.hasOwnProperty(key)) {
+            delete options[key];
+        }
+    }
+
     return options;
 };
 
@@ -509,24 +605,24 @@ exports.mergeWithDefaults = function (options) {
  *      The converted property list
  */
 exports.convertProperties = function (options) {
-    if (options.id) {
-        options.id = options.id.toString();
-    }
 
-    if (options.date === undefined) {
-        options.date = new Date();
-    }
+    options.id         = options.id.toString();
+    options.title      = options.title.toString();
+    options.message    = options.message.toString();
+    options.autoCancel = options.autoCancel === true;
 
-    if (options.title) {
-        options.title = options.title.toString();
+    if (isNaN(options.id)) {
+        options.id = this.getDefaults().id;
     }
 
-    if (options.message) {
-        options.message = options.message.toString();
+    if (isNaN(options.badge)) {
+        options.badge = this.getDefaults().badge;
     }
 
-    if (options.text) {
-        options.message = options.text.toString();
+    options.badge = Number(options.badge);
+
+    if (options.date === undefined || options.date === null) {
+        options.date = new Date();
     }
 
     if (typeof options.date == 'object') {
@@ -610,6 +706,29 @@ exports.convertIds = function (ids) {
     return convertedIds;
 };
 
+/**
+ * @private
+ *
+ * Return the first found value for the given keys.
+ *
+ * @param {Object} options
+ *      Object with key-value properties
+ *
+ * @param {String[]} keys*
+ *      Key list
+ */
+exports.getValueFor = function (options) {
+    var keys = Array.apply(null, arguments).slice(1);
+
+    for (var i = 0; i < keys.length; i++) {
+        var key = keys[i];
+
+        if (options.hasOwnProperty(key)) {
+            return options[key];
+        }
+    }
+};
+
 /**
  * @private
  *