BVB Source Codes

waterline Show avg.js Source code

Return Download waterline: download avg.js Source code - Download waterline Source code - Type:.js
  1. /**
  2.  * Module dependencies
  3.  */
  4.  
  5. var util = require('util');
  6. var _ = require('@sailshq/lodash');
  7. var flaverr = require('flaverr');
  8. var forgeStageTwoQuery = require('../utils/query/forge-stage-two-query');
  9. var forgeStageThreeQuery = require('../utils/query/forge-stage-three-query');
  10. var Deferred = require('../utils/query/deferred');
  11.  
  12.  
  13. /**
  14.  * avg()
  15.  *
  16.  * Get the arithmetic mean of the specified attribute across all matching records.
  17.  *
  18.  * ```
  19.  * // The average balance of bank accounts owned by people between
  20.  * // the ages of 35 and 45.
  21.  * BankAccount.avg('balance').where({
  22.  *   ownerAge: { '>=': 35, '<=': 45 }
  23.  * }).exec(function (err, averageBalance){
  24.  *   // ...
  25.  * });
  26.  * ```
  27.  *
  28.  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  29.  *
  30.  * Usage without deferred object:
  31.  * ================================================
  32.  *
  33.  * @param {String?} numericAttrName
  34.  *
  35.  * @param {Dictionary?} criteria
  36.  *
  37.  * @param {Dictionary} moreQueryKeys
  38.  *        For internal use.
  39.  *        (A dictionary of query keys.)
  40.  *
  41.  * @param {Function?} done
  42.  *        Callback function to run when query has either finished successfully or errored.
  43.  *        (If unspecified, will return a Deferred object instead of actually doing anything.)
  44.  *
  45.  * @param {Ref?} meta
  46.  *     For internal use.
  47.  *
  48.  * @returns {Ref?} Deferred object if no `done` callback was provided
  49.  *
  50.  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  51.  *
  52.  * The underlying query keys:
  53.  * ==============================
  54.  *
  55.  * @qkey {String} numericAttrName
  56.  *     The name of a numeric attribute.
  57.  *     (Must be declared as `type: 'number'`.)
  58.  *
  59.  * @qkey {Dictionary?} criteria
  60.  *
  61.  * @qkey {Dictionary?} meta
  62.  * @qkey {String} using
  63.  * @qkey {String} method
  64.  *
  65.  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  66.  */
  67.  
  68. module.exports = function avg( /* numericAttrName?, criteria?, moreQueryKeys?, done?, meta? */ ) {
  69.  
  70.   // Set up a few, common local vars for convenience / familiarity.
  71.   var WLModel = this;
  72.   var orm = this.waterline;
  73.   var modelIdentity = this.identity;
  74.  
  75.  
  76.   // Build query w/ initial, universal keys.
  77.   var query = {
  78.     method: 'avg',
  79.     using: modelIdentity
  80.   };
  81.  
  82.  
  83.   //  鈻堚枅鈺   鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚晽 鈻堚枅鈻堚枅鈻堚枅鈺 鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚晽 鈻堚枅鈻堚枅鈻堚枅鈺 鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚枅鈺
  84.   //  鈻堚枅鈺   鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈻堚枅鈺椻枅鈻堚晹鈺愨晲鈻堚枅鈺椻枅鈻堚晳鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈺愨晲鈺濃枅鈻堚晹鈺愨晲鈺愨晲鈺
  85.   //  鈻堚枅鈺   鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈻堚晹鈺濃枅鈻堚晳鈻堚枅鈻堚枅鈻堚枅鈻堚晳鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚晳鈻堚枅鈺     鈻堚枅鈻堚枅鈻堚枅鈻堚晽
  86.   //  鈺氣枅鈻堚晽 鈻堚枅鈺斺暆鈻堚枅鈺斺晲鈺愨枅鈻堚晳鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈻堚枅鈺戔枅鈻堚晳  鈻堚枅鈺戔枅鈻堚晳鈻堚枅鈺     鈺氣晲鈺愨晲鈺愨枅鈻堚晳
  87.   //   鈺氣枅鈻堚枅鈻堚晹鈺 鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚晳  鈻堚枅鈺戔枅鈻堚晳鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈻堚晹鈺濃枅鈻堚晳鈺氣枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈻堚晳
  88.   //    鈺氣晲鈺愨晲鈺  鈺氣晲鈺  鈺氣晲鈺濃暁鈺愨暆  鈺氣晲鈺濃暁鈺愨暆鈺氣晲鈺  鈺氣晲鈺濃暁鈺愨晲鈺愨晲鈺愨暆 鈺氣晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺濃暁鈺愨晲鈺愨晲鈺愨晲鈺
  89.   //
  90.  
  91.   // The `done` callback, if one was provided.
  92.   var done;
  93.  
  94.   // Handle the various supported usage possibilities
  95.   // (locate the `done` callback, and extend the `query` dictionary)
  96.   //
  97.   // > Note that we define `args` so that we can insulate access
  98.   // > to the arguments provided to this function.
  99.   var args = arguments;
  100.   (function _handleVariadicUsage(){
  101.  
  102.  
  103.     // Additional query keys.
  104.     var _moreQueryKeys;
  105.  
  106.     // The metadata container, if one was provided.
  107.     var _meta;
  108.  
  109.  
  110.     // Handle first argument:
  111.     //
  112.     // 鈥 avg(numericAttrName, ...)
  113.     query.numericAttrName = args[0];
  114.  
  115.  
  116.     // Handle double meaning of second argument:
  117.     //
  118.     // 鈥 avg(..., criteria, done, _meta)
  119.     var is2ndArgDictionary = (_.isObject(args[1]) && !_.isFunction(args[1]) && !_.isArray(args[1]));
  120.     if (is2ndArgDictionary) {
  121.       query.criteria = args[1];
  122.       done = args[2];
  123.       _meta = args[3];
  124.     }
  125.     // 鈥 avg(..., done, _meta)
  126.     else {
  127.       done = args[1];
  128.       _meta = args[2];
  129.     }
  130.  
  131.  
  132.     // Handle double meaning of third argument:
  133.     //
  134.     // 鈥 avg(..., ..., _moreQueryKeys, done, _meta)
  135.     var is3rdArgDictionary = (_.isObject(args[2]) && !_.isFunction(args[2]) && !_.isArray(args[2]));
  136.     if (is3rdArgDictionary) {
  137.       _moreQueryKeys = args[2];
  138.       done = args[3];
  139.       _meta = args[4];
  140.     }
  141.     // 鈥 avg(..., ..., done, _meta)
  142.     else {
  143.       done = args[2];
  144.       _meta = args[3];
  145.     }
  146.  
  147.  
  148.     // Fold in `_moreQueryKeys`, if relevant.
  149.     //
  150.     // > Userland is prevented from overriding any of the universal keys this way.
  151.     if (_moreQueryKeys) {
  152.       delete _moreQueryKeys.method;
  153.       delete _moreQueryKeys.using;
  154.       delete _moreQueryKeys.meta;
  155.       _.extend(query, _moreQueryKeys);
  156.     } // >-
  157.  
  158.  
  159.     // Fold in `_meta`, if relevant.
  160.     if (!_.isUndefined(_meta)) {
  161.       query.meta = _meta;
  162.     } // >-
  163.  
  164.   })();
  165.  
  166.  
  167.  
  168.  
  169.   //  鈻堚枅鈻堚枅鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈺
  170.   //  鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺斺晲鈺愨枅鈻堚晽
  171.   //  鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈺  鈻堚枅鈻堚枅鈻堚晽  鈻堚枅鈻堚枅鈻堚晽  鈻堚枅鈻堚枅鈻堚枅鈺斺暆
  172.   //  鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈺  鈻堚枅鈺斺晲鈺愨暆  鈻堚枅鈺斺晲鈺愨暆  鈻堚枅鈺斺晲鈺愨枅鈻堚晽
  173.   //  鈻堚枅鈻堚枅鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺     鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺  鈻堚枅鈺
  174.   //  鈺氣晲鈺愨晲鈺愨晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺     鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺  鈺氣晲鈺
  175.   //
  176.   //   鈻堚枅鈺椻枅鈻堚枅鈺   鈻堚枅鈻堚晽 鈻堚枅鈻堚枅鈻堚晽 鈻堚枅鈺   鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚晽 鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺
  177.   //  鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈺 鈻堚枅鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈻堚枅鈺椻暁鈻堚枅鈺 鈻堚枅鈺斺暆鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈺氣枅鈻堚晽
  178.   //  鈻堚枅鈺 鈻堚枅鈺斺枅鈻堚枅鈻堚晹鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈻堚枅鈺 鈺氣枅鈻堚枅鈻堚晹鈺 鈻堚枅鈻堚枅鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈻堚晽   鈻堚枅鈺
  179.   //  鈻堚枅鈺 鈻堚枅鈺戔暁鈻堚枅鈺斺暆鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈻堚枅鈺  鈺氣枅鈻堚晹鈺  鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨暆   鈻堚枅鈺
  180.   //  鈺氣枅鈻堚晽鈻堚枅鈺 鈺氣晲鈺 鈻堚枅鈺戔枅鈻堚晳  鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈻堚枅鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺斺暆
  181.   //   鈺氣晲鈺濃暁鈺愨暆     鈺氣晲鈺濃暁鈺愨暆  鈺氣晲鈺   鈺氣晲鈺   鈺氣晲鈺愨晲鈺愨晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺
  182.   //
  183.   //  鈹屸攼 鈹 鈹敩鈹  鈹屸敩鈹   鈹   鈹攢鈹愨攲鈹€鈹愨攲鈹攼鈹 鈹敩鈹€鈹愨攲鈹愨攲  鈹屸攼鈹屸攲鈹€鈹愨敩 鈹  鈹屸敩鈹愨攲鈹€鈹愨攲鈹€鈹愨攲鈹€鈹愨敩鈹€鈹愨敩鈹€鈹愨攲鈹€鈹愨攲鈹攼
  184.   //  鈹溾敶鈹愨攤 鈹傗攤鈹   鈹傗攤  鈹屸敿鈹€  鈹溾敩鈹樷敎鈹  鈹 鈹 鈹傗敎鈹敇鈹傗攤鈹  鈹傗攤鈹傗敎鈹 鈹傗攤鈹   鈹傗攤鈹溾敜 鈹溾敜 鈹溾敜 鈹溾敩鈹樷敎鈹敇鈹溾敜  鈹傗攤
  185.   //  鈹斺攢鈹樷敂鈹€鈹樷敶鈹粹攢鈹樷攢鈹粹敇  鈹斺敇   鈹粹敂鈹€鈹斺攢鈹 鈹 鈹斺攢鈹樷敶鈹斺攢鈹樷敂鈹  鈹樷敂鈹樷敂鈹€鈹樷敂鈹粹敇  鈹€鈹粹敇鈹斺攢鈹樷敂  鈹斺攢鈹樷敶鈹斺攢鈹粹敂鈹€鈹斺攢鈹樷攢鈹粹敇
  186.   //  鈹屸攢    鈹攲鈹€鈹  鈹攢鈹愨攲鈹€鈹愨敩  鈹屸攢鈹愨敩  鈹攲鈹€鈹愨攲鈹愨攲鈹屸敩鈹    鈹€鈹
  187.   //  鈹傗攢鈹€鈹€  鈹傗敎鈹   鈹溾敩鈹樷敎鈹 鈹  鈹溾敜 鈹斺攼鈹屸敇鈹溾攢鈹も攤鈹傗攤 鈹   鈹€鈹€鈹€鈹
  188.   //  鈹斺攢    鈹粹敂    鈹粹敂鈹€鈹斺攢鈹樷敶鈹€鈹樷敂鈹€鈹 鈹斺敇 鈹 鈹粹敇鈹斺敇 鈹     鈹€鈹
  189.   // If a callback function was not specified, then build a new `Deferred` and bail now.
  190.   //
  191.   // > This method will be called AGAIN automatically when the Deferred is executed.
  192.   // > and next time, it'll have a callback.
  193.   if (!done) {
  194.     return new Deferred(WLModel, avg, query);
  195.   } // --鈥
  196.  
  197.  
  198.   // Otherwise, IWMIH, we know that a callback was specified.
  199.   // So...
  200.   //
  201.   //  鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺  鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚枅鈺椻枅鈻堚晽   鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈻堚晽
  202.   //  鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈺氣枅鈻堚晽鈻堚枅鈺斺暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺   鈻堚枅鈺戔暁鈺愨晲鈻堚枅鈺斺晲鈺愨暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆
  203.   //  鈻堚枅鈻堚枅鈻堚晽   鈺氣枅鈻堚枅鈺斺暆 鈻堚枅鈻堚枅鈻堚晽  鈻堚枅鈺     鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈻堚枅鈻堚晽
  204.   //  鈻堚枅鈺斺晲鈺愨暆   鈻堚枅鈺斺枅鈻堚晽 鈻堚枅鈺斺晲鈺愨暆  鈻堚枅鈺     鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈺斺晲鈺愨暆
  205.   //  鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺斺暆 鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚枅鈺椻暁鈻堚枅鈻堚枅鈻堚枅鈺椻暁鈻堚枅鈻堚枅鈻堚枅鈺斺暆   鈻堚枅鈺   鈻堚枅鈻堚枅鈻堚枅鈻堚晽
  206.   //  鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺  鈺氣晲鈺濃暁鈺愨晲鈺愨晲鈺愨晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺    鈺氣晲鈺   鈺氣晲鈺愨晲鈺愨晲鈺愨暆
  207.  
  208.   //  鈺斺晲鈺椻晹鈺愨晽鈺︹晲鈺椻晹鈺愨晽鈺斺晲鈺  鈹屸攢鈹愨攲鈹攼鈹屸攢鈹愨攲鈹€鈹愨攲鈹€鈹  鈹屸敩鈹愨敩 鈹攲鈹€鈹  鈹屸攢鈹 鈹 鈹攲鈹€鈹愨敩鈹€鈹愨敩 鈹
  209.   //  鈺犫暎 鈺 鈺戔暊鈺︹暆鈺 鈺︹晳鈺   鈹斺攢鈹 鈹 鈹溾攢鈹も攤 鈹敎鈹    鈹 鈹傗攤鈹傗攤 鈹  鈹傗攢鈹尖攼鈹 鈹傗敎鈹 鈹溾敩鈹樷敂鈹敇
  210.   //  鈺  鈺氣晲鈺濃暕鈺氣晲鈺氣晲鈺濃暁鈺愨暆  鈹斺攢鈹 鈹 鈹 鈹粹敂鈹€鈹樷敂鈹€鈹   鈹 鈹斺敶鈹樷敂鈹€鈹  鈹斺攢鈹樷敂鈹斺攢鈹樷敂鈹€鈹樷敶鈹斺攢 鈹
  211.   //
  212.   // Forge a stage 2 query (aka logical protostatement)
  213.   try {
  214.     forgeStageTwoQuery(query, orm);
  215.   } catch (e) {
  216.     switch (e.code) {
  217.  
  218.       case 'E_INVALID_NUMERIC_ATTR_NAME':
  219.         return done(
  220.           flaverr(
  221.             { name: 'UsageError' },
  222.             new Error(
  223.               'The numeric attr name (i.e. first argument) to `.avg()` should '+
  224.               'be the name of an attribute in this model which is defined with `type: \'number\'`.\n'+
  225.               'Details:\n'+
  226.               '  ' + e.details + '\n'
  227.             )
  228.           )
  229.         );
  230.         // ^ custom override for the standard usage error.  Note that we use `.details` to get at
  231.         //   the underlying, lower-level error message (instead of logging redundant stuff from
  232.         //   the envelope provided by the default error msg.)
  233.  
  234.       // If the criteria wouldn't match anything, that'd basically be like dividing by zero, which is impossible.
  235.       case 'E_NOOP':
  236.         return done(flaverr({ name: 'UsageError' }, new Error(
  237.           'Attempting to compute this average would be like dividing by zero, which is impossible.\n'+
  238.           'Details:\n'+
  239.           '  ' + e.details + '\n'
  240.         )));
  241.  
  242.       case 'E_INVALID_CRITERIA':
  243.       case 'E_INVALID_META':
  244.         return done(e);
  245.         // ^ when the standard usage error is good enough as-is, without any further customization
  246.  
  247.       default:
  248.         return done(e);
  249.         // ^ when an internal, miscellaneous, or unexpected error occurs
  250.     }
  251.   } // >-鈥
  252.  
  253.  
  254.   //  鈺斺晲鈺椻晹鈺愨晽鈺︹晲鈺椻晹鈺愨晽鈺斺晲鈺  鈹屸攢鈹愨攲鈹攼鈹屸攢鈹愨攲鈹€鈹愨攲鈹€鈹  鈹屸敩鈹愨敩 鈹敩鈹€鈹愨攲鈹€鈹愨攲鈹€鈹  鈹屸攢鈹 鈹 鈹攲鈹€鈹愨敩鈹€鈹愨敩 鈹
  255.   //  鈺犫暎 鈺 鈺戔暊鈺︹暆鈺 鈺︹晳鈺   鈹斺攢鈹 鈹 鈹溾攢鈹も攤 鈹敎鈹    鈹 鈹溾攢鈹も敎鈹敇鈹溾敜 鈹溾敜   鈹傗攢鈹尖攼鈹 鈹傗敎鈹 鈹溾敩鈹樷敂鈹敇
  256.   //  鈺  鈺氣晲鈺濃暕鈺氣晲鈺氣晲鈺濃暁鈺愨暆  鈹斺攢鈹 鈹 鈹 鈹粹敂鈹€鈹樷敂鈹€鈹   鈹 鈹 鈹粹敶鈹斺攢鈹斺攢鈹樷敂鈹€鈹  鈹斺攢鈹樷敂鈹斺攢鈹樷敂鈹€鈹樷敶鈹斺攢 鈹
  257.   try {
  258.     query = forgeStageThreeQuery({
  259.       stageTwoQuery: query,
  260.       identity: modelIdentity,
  261.       transformer: WLModel._transformer,
  262.       originalModels: orm.collections
  263.     });
  264.   } catch (e) { return done(e); }
  265.  
  266.  
  267.   //  鈹屸攢鈹愨攲鈹€鈹愨攲鈹愨攲鈹屸敩鈹  鈹屸敩鈹愨攲鈹€鈹  鈺斺晲鈺椻晹鈺︹晽鈺斺晲鈺椻晹鈺愨晽鈺斺暒鈺椻晹鈺愨晽鈺︹晲鈺
  268.   //  鈹斺攢鈹愨敎鈹 鈹傗攤鈹 鈹傗攤   鈹 鈹 鈹  鈺犫晲鈺 鈺戔晳鈺犫晲鈺b暊鈺愨暆 鈺 鈺戔暎 鈺犫暒鈺
  269.   //  鈹斺攢鈹樷敂鈹€鈹樷敇鈹斺敇鈹€鈹粹敇   鈹 鈹斺攢鈹  鈺 鈺┾晲鈺┾暆鈺 鈺┾暕   鈺 鈺氣晲鈺濃暕鈺氣晲
  270.   // Grab the appropriate adapter method and call it.
  271.   var adapter = WLModel._adapter;
  272.   if (!adapter.avg) {
  273.     return done(new Error('Cannot complete query: The adapter used by this model (`' + modelIdentity + '`) doesn\'t support the `'+query.method+'` method.'));
  274.   }
  275.  
  276.   adapter.avg(WLModel.datastore, query, function _afterTalkingToAdapter(err, arithmeticMean) {
  277.     if (err) {
  278.  
  279.       if (!_.isError(err)) {
  280.         return done(new Error(
  281.           'If an error is sent back from the adapter, it should always be an Error instance.  '+
  282.           'But instead, got: '+util.inspect(err, {depth:5})+''
  283.         ));
  284.       }//-鈥
  285.  
  286.       err.modelIdentity = modelIdentity;
  287.       return done(err);
  288.     }//-鈥
  289.  
  290.     return done(undefined, arithmeticMean);
  291.  
  292.   });//</adapter.avg()>
  293.  
  294. };
  295.  
downloadavg.js Source code - Download waterline Source code
Related Source Codes/Software:
notepad-plus-plus - Notepad++ official repository h... 2017-01-10
che - Eclipse Che: Next-generation Eclipse IDE. Open sou... 2017-01-10
Gource - oftware version control visualization ... 2017-01-10
FDFullscreenPopGesture - A UINavigationController's category to enable full... 2017-01-10
node-style-guide - A guide for styling your node.js / JavaScript code... 2017-01-09
Workerman - An asynchronous event driven PHP framework for eas... 2017-01-10
structor - An advanced visual editor for React components ... 2017-01-10
golearn - Machine Learning for Go 2017-01-10
poisontap - Exploits locked/password protected computers over ... 2017-01-10
kcptun - A Simple UDP Tunnel Based On KCP 2017-01-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top