124 lines · 2.7 KB · JavaScript
RawDownload
app.collections.Docs = class Docs extends app.Collection {  static model = "Doc";  static NORMALIZE_VERSION_RGX = /\.(\d)$/;  static NORMALIZE_VERSION_SUB = ".0$1";   // Load models concurrently.  // It's not pretty but I didn't want to import a promise library only for this.  static CONCURRENCY = 3;   findBySlug(slug) {    return (      this.findBy("slug", slug) || this.findBy("slug_without_version", slug)    );  }  sort() {    return this.models.sort((a, b) => {      if (a.name === b.name) {        if (          !a.version ||          a.version.replace(            Docs.NORMALIZE_VERSION_RGX,            Docs.NORMALIZE_VERSION_SUB,          ) >            b.version.replace(              Docs.NORMALIZE_VERSION_RGX,              Docs.NORMALIZE_VERSION_SUB,            )        ) {          return -1;        } else {          return 1;        }      } else if (a.name.toLowerCase() > b.name.toLowerCase()) {        return 1;      } else {        return -1;      }    });  }  load(onComplete, onError, options) {    let i = 0;     var next = () => {      if (i < this.models.length) {        this.models[i].load(next, fail, options);      } else if (i === this.models.length + Docs.CONCURRENCY - 1) {        onComplete();      }      i++;    };     var fail = function (...args) {      if (onError) {        onError(args);        onError = null;      }      next();    };     for (let j = 0, end = Docs.CONCURRENCY; j < end; j++) {      next();    }  }   clearCache() {    for (var doc of this.models) {      doc.clearCache();    }  }   uninstall(callback) {    let i = 0;    var next = () => {      if (i < this.models.length) {        this.models[i++].uninstall(next, next);      } else {        callback();      }    };    next();  }   getInstallStatuses(callback) {    app.db.versions(this.models, (statuses) => {      if (statuses) {        for (var key in statuses) {          var value = statuses[key];          statuses[key] = { installed: !!value, mtime: value };        }      }      callback(statuses);    });  }   checkForUpdates(callback) {    this.getInstallStatuses((statuses) => {      let i = 0;      if (statuses) {        for (var slug in statuses) {          var status = statuses[slug];          if (this.findBy("slug", slug).isOutdated(status)) {            i += 1;          }        }      }      callback(i);    });  }   updateInBackground() {    this.getInstallStatuses((statuses) => {      if (!statuses) {        return;      }      for (var slug in statuses) {        var status = statuses[slug];        var doc = this.findBy("slug", slug);        if (doc.isOutdated(status)) {          doc.install($.noop, $.noop);        }      }    });  }};