docs.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. app.collections.Docs = class Docs extends app.Collection {
  2. static model = "Doc";
  3. static NORMALIZE_VERSION_RGX = /\.(\d)$/;
  4. static NORMALIZE_VERSION_SUB = ".0$1";
  5. // Load models concurrently.
  6. // It's not pretty but I didn't want to import a promise library only for this.
  7. static CONCURRENCY = 3;
  8. findBySlug(slug) {
  9. return (
  10. this.findBy("slug", slug) || this.findBy("slug_without_version", slug)
  11. );
  12. }
  13. sort() {
  14. return this.models.sort((a, b) => {
  15. if (a.name === b.name) {
  16. if (
  17. !a.version ||
  18. a.version.replace(
  19. Docs.NORMALIZE_VERSION_RGX,
  20. Docs.NORMALIZE_VERSION_SUB,
  21. ) >
  22. b.version.replace(
  23. Docs.NORMALIZE_VERSION_RGX,
  24. Docs.NORMALIZE_VERSION_SUB,
  25. )
  26. ) {
  27. return -1;
  28. } else {
  29. return 1;
  30. }
  31. } else if (a.name.toLowerCase() > b.name.toLowerCase()) {
  32. return 1;
  33. } else {
  34. return -1;
  35. }
  36. });
  37. }
  38. load(onComplete, onError, options) {
  39. let i = 0;
  40. var next = () => {
  41. if (i < this.models.length) {
  42. this.models[i].load(next, fail, options);
  43. } else if (i === this.models.length + Docs.CONCURRENCY - 1) {
  44. onComplete();
  45. }
  46. i++;
  47. };
  48. var fail = function (...args) {
  49. if (onError) {
  50. onError(args);
  51. onError = null;
  52. }
  53. next();
  54. };
  55. for (let j = 0, end = Docs.CONCURRENCY; j < end; j++) {
  56. next();
  57. }
  58. }
  59. clearCache() {
  60. for (var doc of this.models) {
  61. doc.clearCache();
  62. }
  63. }
  64. uninstall(callback) {
  65. let i = 0;
  66. var next = () => {
  67. if (i < this.models.length) {
  68. this.models[i++].uninstall(next, next);
  69. } else {
  70. callback();
  71. }
  72. };
  73. next();
  74. }
  75. getInstallStatuses(callback) {
  76. app.db.versions(this.models, (statuses) => {
  77. if (statuses) {
  78. for (var key in statuses) {
  79. var value = statuses[key];
  80. statuses[key] = { installed: !!value, mtime: value };
  81. }
  82. }
  83. callback(statuses);
  84. });
  85. }
  86. checkForUpdates(callback) {
  87. this.getInstallStatuses((statuses) => {
  88. let i = 0;
  89. if (statuses) {
  90. for (var slug in statuses) {
  91. var status = statuses[slug];
  92. if (this.findBy("slug", slug).isOutdated(status)) {
  93. i += 1;
  94. }
  95. }
  96. }
  97. callback(i);
  98. });
  99. }
  100. updateInBackground() {
  101. this.getInstallStatuses((statuses) => {
  102. if (!statuses) {
  103. return;
  104. }
  105. for (var slug in statuses) {
  106. var status = statuses[slug];
  107. var doc = this.findBy("slug", slug);
  108. if (doc.isOutdated(status)) {
  109. doc.install($.noop, $.noop);
  110. }
  111. }
  112. });
  113. }
  114. };