BVB Source Codes

waterline Show find-or-create.js Source code

Return Download waterline: download find-or-create.js Source code - Download waterline Source code - Type:.js
  1. /**
  2.  * Module dependencies
  3.  */
  4.  
  5. var _ = require('@sailshq/lodash');
  6. var flaverr = require('flaverr');
  7. var Deferred = require('../utils/query/deferred');
  8. var forgeStageTwoQuery = require('../utils/query/forge-stage-two-query');
  9.  
  10.  
  11. /**
  12.  * findOrCreate()
  13.  *
  14.  * Find the record matching the specified criteria.  If no record exists or more
  15.  * than one record matches the criteria, an error will be returned.
  16.  *
  17.  * ```
  18.  * // Ensure an a pet with type dog exists
  19.  * PetType.findOrCreate({ type: 'dog' }, { name: 'Pretend pet type', type: 'dog' })
  20.  * .exec(function(err, petType, wasCreated) {
  21.  *   // ...
  22.  * });
  23.  * ```
  24.  *
  25.  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  26.  *
  27.  * Usage without deferred object:
  28.  * ================================================
  29.  *
  30.  * @param {Dictionary?} criteria
  31.  *
  32.  * @param {Dictionary} newRecord
  33.  *
  34.  * @param {Function?} done
  35.  *        Callback function to run when query has either finished successfully or errored.
  36.  *        (If unspecified, will return a Deferred object instead of actually doing anything.)
  37.  *
  38.  * @param {Ref?} meta
  39.  *     For internal use.
  40.  *
  41.  * @returns {Ref?} Deferred object if no `done` callback was provided
  42.  *
  43.  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  44.  *
  45.  * The underlying query keys:
  46.  * ==============================
  47.  *
  48.  * @qkey {Dictionary?} criteria
  49.  * @qkey {Dictionary?} newRecord
  50.  *
  51.  * @qkey {Dictionary?} meta
  52.  * @qkey {String} using
  53.  * @qkey {String} method
  54.  *
  55.  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  56.  */
  57.  
  58. module.exports = function findOrCreate( /* criteria?, newRecord?, done?, meta? */ ) {
  59.  
  60.   // Set up a few, common local vars for convenience / familiarity.
  61.   var WLModel = this;
  62.   var orm = this.waterline;
  63.   var modelIdentity = this.identity;
  64.  
  65.   // Build query w/ initial, universal keys.
  66.   var query = {
  67.     method: 'findOrCreate',
  68.     using: modelIdentity
  69.   };
  70.  
  71.  
  72.   //  鈻堚枅鈺   鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚晽 鈻堚枅鈻堚枅鈻堚枅鈺 鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚晽 鈻堚枅鈻堚枅鈻堚枅鈺 鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚枅鈺
  73.   //  鈻堚枅鈺   鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈻堚枅鈺椻枅鈻堚晹鈺愨晲鈻堚枅鈺椻枅鈻堚晳鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈺愨晲鈺濃枅鈻堚晹鈺愨晲鈺愨晲鈺
  74.   //  鈻堚枅鈺   鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈻堚晹鈺濃枅鈻堚晳鈻堚枅鈻堚枅鈻堚枅鈻堚晳鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚晳鈻堚枅鈺     鈻堚枅鈻堚枅鈻堚枅鈻堚晽
  75.   //  鈺氣枅鈻堚晽 鈻堚枅鈺斺暆鈻堚枅鈺斺晲鈺愨枅鈻堚晳鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈻堚枅鈺戔枅鈻堚晳  鈻堚枅鈺戔枅鈻堚晳鈻堚枅鈺     鈺氣晲鈺愨晲鈺愨枅鈻堚晳
  76.   //   鈺氣枅鈻堚枅鈻堚晹鈺 鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚晳  鈻堚枅鈺戔枅鈻堚晳鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈻堚晹鈺濃枅鈻堚晳鈺氣枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈻堚晳
  77.   //    鈺氣晲鈺愨晲鈺  鈺氣晲鈺  鈺氣晲鈺濃暁鈺愨暆  鈺氣晲鈺濃暁鈺愨暆鈺氣晲鈺  鈺氣晲鈺濃暁鈺愨晲鈺愨晲鈺愨暆 鈺氣晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺濃暁鈺愨晲鈺愨晲鈺愨晲鈺
  78.   //
  79.  
  80.   // The `done` callback, if one was provided.
  81.   var done;
  82.  
  83.   // Handle the various supported usage possibilities
  84.   // (locate the `done` callback, and extend the `query` dictionary)
  85.   //
  86.   // > Note that we define `args` so that we can insulate access
  87.   // > to the arguments provided to this function.
  88.   var args = arguments;
  89.   (function _handleVariadicUsage() {
  90.     // The metadata container, if one was provided.
  91.     var _meta;
  92.  
  93.     // Handle first argument:
  94.     //
  95.     // 鈥 findOrCreate(criteria, ...)
  96.     query.criteria = args[0];
  97.  
  98.     // Handle second argument:
  99.     //
  100.     // 鈥 findOrCreate(criteria, newRecord)
  101.     query.newRecord = args[1];
  102.  
  103.     done = args[2];
  104.     _meta = args[3];
  105.  
  106.     // Fold in `_meta`, if relevant.
  107.     if (_meta) {
  108.       query.meta = _meta;
  109.     } // >-
  110.  
  111.   })();
  112.  
  113.  
  114.  
  115.   //  鈻堚枅鈻堚枅鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈺
  116.   //  鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺斺晲鈺愨枅鈻堚晽
  117.   //  鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈺  鈻堚枅鈻堚枅鈻堚晽  鈻堚枅鈻堚枅鈻堚晽  鈻堚枅鈻堚枅鈻堚枅鈺斺暆
  118.   //  鈻堚枅鈺  鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈺  鈻堚枅鈺斺晲鈺愨暆  鈻堚枅鈺斺晲鈺愨暆  鈻堚枅鈺斺晲鈺愨枅鈻堚晽
  119.   //  鈻堚枅鈻堚枅鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺     鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺  鈻堚枅鈺
  120.   //  鈺氣晲鈺愨晲鈺愨晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺     鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺  鈺氣晲鈺
  121.   //
  122.   //   鈻堚枅鈺椻枅鈻堚枅鈺   鈻堚枅鈻堚晽 鈻堚枅鈻堚枅鈻堚晽 鈻堚枅鈺   鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚晽 鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺
  123.   //  鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈺 鈻堚枅鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈻堚枅鈺椻暁鈻堚枅鈺 鈻堚枅鈺斺暆鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈺氣枅鈻堚晽
  124.   //  鈻堚枅鈺 鈻堚枅鈺斺枅鈻堚枅鈻堚晹鈻堚枅鈺戔枅鈻堚枅鈻堚枅鈻堚枅鈺 鈺氣枅鈻堚枅鈻堚晹鈺 鈻堚枅鈻堚枅鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈻堚晽   鈻堚枅鈺
  125.   //  鈻堚枅鈺 鈻堚枅鈺戔暁鈻堚枅鈺斺暆鈻堚枅鈺戔枅鈻堚晹鈺愨晲鈻堚枅鈺  鈺氣枅鈻堚晹鈺  鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨暆   鈻堚枅鈺
  126.   //  鈺氣枅鈻堚晽鈻堚枅鈺 鈺氣晲鈺 鈻堚枅鈺戔枅鈻堚晳  鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈻堚枅鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺斺暆
  127.   //   鈺氣晲鈺濃暁鈺愨暆     鈺氣晲鈺濃暁鈺愨暆  鈺氣晲鈺   鈺氣晲鈺   鈺氣晲鈺愨晲鈺愨晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺
  128.   //
  129.   //  鈹屸攼 鈹 鈹敩鈹  鈹屸敩鈹   鈹   鈹攢鈹愨攲鈹€鈹愨攲鈹攼鈹 鈹敩鈹€鈹愨攲鈹愨攲  鈹屸攼鈹屸攲鈹€鈹愨敩 鈹  鈹屸敩鈹愨攲鈹€鈹愨攲鈹€鈹愨攲鈹€鈹愨敩鈹€鈹愨敩鈹€鈹愨攲鈹€鈹愨攲鈹攼
  130.   //  鈹溾敶鈹愨攤 鈹傗攤鈹   鈹傗攤  鈹屸敿鈹€  鈹溾敩鈹樷敎鈹  鈹 鈹 鈹傗敎鈹敇鈹傗攤鈹  鈹傗攤鈹傗敎鈹 鈹傗攤鈹   鈹傗攤鈹溾敜 鈹溾敜 鈹溾敜 鈹溾敩鈹樷敎鈹敇鈹溾敜  鈹傗攤
  131.   //  鈹斺攢鈹樷敂鈹€鈹樷敶鈹粹攢鈹樷攢鈹粹敇  鈹斺敇   鈹粹敂鈹€鈹斺攢鈹 鈹 鈹斺攢鈹樷敶鈹斺攢鈹樷敂鈹  鈹樷敂鈹樷敂鈹€鈹樷敂鈹粹敇  鈹€鈹粹敇鈹斺攢鈹樷敂  鈹斺攢鈹樷敶鈹斺攢鈹粹敂鈹€鈹斺攢鈹樷攢鈹粹敇
  132.   //  鈹屸攢    鈹攲鈹€鈹  鈹攢鈹愨攲鈹€鈹愨敩  鈹屸攢鈹愨敩  鈹攲鈹€鈹愨攲鈹愨攲鈹屸敩鈹    鈹€鈹
  133.   //  鈹傗攢鈹€鈹€  鈹傗敎鈹   鈹溾敩鈹樷敎鈹 鈹  鈹溾敜 鈹斺攼鈹屸敇鈹溾攢鈹も攤鈹傗攤 鈹   鈹€鈹€鈹€鈹
  134.   //  鈹斺攢    鈹粹敂    鈹粹敂鈹€鈹斺攢鈹樷敶鈹€鈹樷敂鈹€鈹 鈹斺敇 鈹 鈹粹敇鈹斺敇 鈹     鈹€鈹
  135.   // If a callback function was not specified, then build a new `Deferred` and bail now.
  136.   //
  137.   // > This method will be called AGAIN automatically when the Deferred is executed.
  138.   // > and next time, it'll have a callback.
  139.   if (!done) {
  140.     return new Deferred(WLModel, findOrCreate, query);
  141.   } // --鈥
  142.  
  143.  
  144.   // Otherwise, IWMIH, we know that a callback was specified.
  145.   // So...
  146.   //
  147.   //  鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺  鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚枅鈺 鈻堚枅鈻堚枅鈻堚枅鈺椻枅鈻堚晽   鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈻堚晽
  148.   //  鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈺氣枅鈻堚晽鈻堚枅鈺斺暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺   鈻堚枅鈺戔暁鈺愨晲鈻堚枅鈺斺晲鈺愨暆鈻堚枅鈺斺晲鈺愨晲鈺愨暆
  149.   //  鈻堚枅鈻堚枅鈻堚晽   鈺氣枅鈻堚枅鈺斺暆 鈻堚枅鈻堚枅鈻堚晽  鈻堚枅鈺     鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈻堚枅鈻堚晽
  150.   //  鈻堚枅鈺斺晲鈺愨暆   鈻堚枅鈺斺枅鈻堚晽 鈻堚枅鈺斺晲鈺愨暆  鈻堚枅鈺     鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈺   鈻堚枅鈺斺晲鈺愨暆
  151.   //  鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺斺暆 鈻堚枅鈺椻枅鈻堚枅鈻堚枅鈻堚枅鈺椻暁鈻堚枅鈻堚枅鈻堚枅鈺椻暁鈻堚枅鈻堚枅鈻堚枅鈺斺暆   鈻堚枅鈺   鈻堚枅鈻堚枅鈻堚枅鈻堚晽
  152.   //  鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺  鈺氣晲鈺濃暁鈺愨晲鈺愨晲鈺愨晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺 鈺氣晲鈺愨晲鈺愨晲鈺    鈺氣晲鈺   鈺氣晲鈺愨晲鈺愨晲鈺愨暆
  153.  
  154.   //  鈺斺晲鈺椻晹鈺愨晽鈺︹晲鈺椻晹鈺愨晽鈺斺晲鈺  鈹屸攢鈹愨攲鈹攼鈹屸攢鈹愨攲鈹€鈹愨攲鈹€鈹  鈹屸敩鈹愨敩 鈹攲鈹€鈹  鈹屸攢鈹 鈹 鈹攲鈹€鈹愨敩鈹€鈹愨敩 鈹
  155.   //  鈺犫暎 鈺 鈺戔暊鈺︹暆鈺 鈺︹晳鈺   鈹斺攢鈹 鈹 鈹溾攢鈹も攤 鈹敎鈹    鈹 鈹傗攤鈹傗攤 鈹  鈹傗攢鈹尖攼鈹 鈹傗敎鈹 鈹溾敩鈹樷敂鈹敇
  156.   //  鈺  鈺氣晲鈺濃暕鈺氣晲鈺氣晲鈺濃暁鈺愨暆  鈹斺攢鈹 鈹 鈹 鈹粹敂鈹€鈹樷敂鈹€鈹   鈹 鈹斺敶鈹樷敂鈹€鈹  鈹斺攢鈹樷敂鈹斺攢鈹樷敂鈹€鈹樷敶鈹斺攢 鈹
  157.   //
  158.   // Forge a stage 2 query (aka logical protostatement)
  159.   try {
  160.     forgeStageTwoQuery(query, orm);
  161.   } catch (e) {
  162.     switch (e.code) {
  163.       case 'E_INVALID_CRITERIA':
  164.         return done(
  165.           flaverr(
  166.             { name: 'UsageError' },
  167.             new Error(
  168.               'Invalid criteria.\n' +
  169.               'Details:\n' +
  170.               '  ' + e.details + '\n'
  171.             )
  172.           )
  173.         );
  174.  
  175.       case 'E_INVALID_NEW_RECORDS':
  176.         return done(
  177.           flaverr(
  178.             { name: 'UsageError' },
  179.             new Error(
  180.               'Invalid new record(s).\n'+
  181.               'Details:\n'+
  182.               '  '+e.details+'\n'
  183.             )
  184.           )
  185.         );
  186.       case 'E_NOOP':
  187.         // If the criteria is deemed to be a no-op, then normalize it into a standard format.
  188.         // This way, it will continue to represent a no-op as we proceed below, so the `findOne()`
  189.         // call will also come back with an E_NOOP, and so then it will go on to do a `.create()`.
  190.         // And most importantly, this way we don't have to worry about the case where the no-op
  191.         // was caused by an edge case like `false` (we need to be able to munge the criteria --
  192.         // i.e. deleting the `limit`).
  193.         var STD_NOOP_CRITERIA = { where: { or: [] } };
  194.         query.criteria = STD_NOOP_CRITERIA;
  195.         break;
  196.  
  197.       default:
  198.         return done(e);
  199.     }
  200.   }// >-鈥
  201.  
  202.  
  203.   // Remove the `limit` clause that may have been automatically attached above.
  204.   // (This is so that the findOne query is valid.)
  205.   delete query.criteria.limit;
  206.  
  207.  
  208.   //  鈺斺晲鈺椻晲鈺 鈺︹晹鈺愨晽鈺斺晲鈺椻暒 鈺︹晹鈺︹晽鈺斺晲鈺  鈹屸攢鈹愨敩鈹屸攼鈹屸攲鈹攼  鈹屸攢鈹愨攲鈹愨攲鈹屸攢鈹  鈹屸攢鈹 鈹 鈹攲鈹€鈹愨敩鈹€鈹愨敩 鈹
  209.   //  鈺戔暎 鈺斺暕鈺︹暆鈺戔暎 鈺  鈺 鈺 鈺 鈺戔暎   鈹溾敜 鈹傗攤鈹傗攤 鈹傗攤  鈹 鈹傗攤鈹傗攤鈹溾敜   鈹傗攢鈹尖攼鈹 鈹傗敎鈹 鈹溾敩鈹樷敂鈹敇
  210.   //  鈺氣晲鈺濃暕 鈺氣晲鈺氣晲鈺濃暁鈺愨暆鈺氣晲鈺 鈺 鈺氣晲鈺  鈹  鈹粹敇鈹斺敇鈹€鈹粹敇  鈹斺攢鈹樷敇鈹斺敇鈹斺攢鈹  鈹斺攢鈹樷敂鈹斺攢鈹樷敂鈹€鈹樷敶鈹斺攢 鈹
  211.   // Note that we pass in `meta` here, which ensures we're on the same db connection.
  212.   // (provided one was explicitly passed in!)
  213.   WLModel.findOne(query.criteria, function _afterPotentiallyFinding(err, foundRecord) {
  214.     if (err) {
  215.       return done(err);
  216.     }
  217.  
  218.     // Note that we pass through a flag as the third argument to our callback,
  219.     // indicating whether a new record was created.
  220.     if (foundRecord) {
  221.       return done(undefined, foundRecord, false);
  222.     }
  223.  
  224.     // So that the create query is valid, check if the primary key value was
  225.     // automatically set to `null` by FS2Q (i.e. because it was unspecified.)
  226.     // And if so, remove it.
  227.     //
  228.     // > IWMIH, we know this was automatic because, if `null` had been
  229.     // > specified explicitly, it would have already caused an error in
  230.     // > our call to FS2Q above (`null` is NEVER a valid PK value)
  231.     var pkAttrName = WLModel.primaryKey;
  232.     var wasPKValueCoercedToNull = _.isNull(query.newRecord[pkAttrName]);
  233.     if (wasPKValueCoercedToNull) {
  234.       delete query.newRecord[pkAttrName];
  235.     }
  236.  
  237.     //  鈺斺晲鈺椻晲鈺 鈺︹晹鈺愨晽鈺斺晲鈺椻暒 鈺︹晹鈺︹晽鈺斺晲鈺  鈹屸攢鈹愨敩鈹€鈹愨攲鈹€鈹愨攲鈹€鈹愨攲鈹攼鈹屸攢鈹  鈹屸攢鈹 鈹 鈹攲鈹€鈹愨敩鈹€鈹愨敩 鈹
  238.     //  鈺戔暎 鈺斺暕鈺︹暆鈺戔暎 鈺  鈺 鈺 鈺 鈺戔暎   鈹  鈹溾敩鈹樷敎鈹 鈹溾攢鈹 鈹 鈹溾敜   鈹傗攢鈹尖攼鈹 鈹傗敎鈹 鈹溾敩鈹樷敂鈹敇
  239.     //  鈺氣晲鈺濃暕 鈺氣晲鈺氣晲鈺濃暁鈺愨暆鈺氣晲鈺 鈺 鈺氣晲鈺  鈹斺攢鈹樷敶鈹斺攢鈹斺攢鈹樷敶 鈹 鈹 鈹斺攢鈹  鈹斺攢鈹樷敂鈹斺攢鈹樷敂鈹€鈹樷敶鈹斺攢 鈹
  240.     WLModel.create(query.newRecord, function _afterCreating(err, createdRecord) {
  241.       if (err) {
  242.         return done(err);
  243.       }
  244.  
  245.       // Pass the newly-created record to our callback.
  246.       // > Note we set the `wasCreated` flag to `true` in this case.
  247.       return done(undefined, createdRecord, true);
  248.  
  249.     }, query.meta);//</.create()>
  250.   }, query.meta);//</.findOne()>
  251. };
  252.  
downloadfind-or-create.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
GoSublime - A Golang plugin collection for SublimeText **3**, ... 2017-02-19
awesome-emacs - A community driven list of useful Emacs packages, ... 2017-02-19
RKNotificationHub - Make any UIView a full fledged notification center 2017-02-19
vimr - Project VimR - Refined Neovim experience for macOS... 2017-02-19
vue-admin - Vue Admin Panel Framework, Powered by Vue 2.0 and ... 2017-02-19
dev-setup - Mac OS X development environment setup: Easy-to-un... 2017-02-19
CMPopTipView - Custom UIView for iOS that pops up an animated "bu... 2017-02-19
git-recipes - Git for recipes in Chinese. The high quality of Gi... 2017-02-19
CLNDR - 2017-02-19
OptiKey - OptiKey - Full computer control and speech with yo... 2017-02-19

 Back to top