mirror of
https://github.com/wekan/wekan.git
synced 2026-02-20 23:14:07 +01:00
Add local fork of meteor-reactive-cache package
- Clone @wekanteam/meteor-reactive-cache to npm-packages/ - Add .meteorignore to exclude npm-packages from Meteor - Update package.json to use local file path This allows direct modification of the package for Meteor 3.0 async migration while maintaining publishability to npm.
This commit is contained in:
parent
88b35a6415
commit
e241e27ca1
40 changed files with 10369 additions and 4 deletions
1
.meteorignore
Normal file
1
.meteorignore
Normal file
|
|
@ -0,0 +1 @@
|
|||
npm-packages/
|
||||
8
npm-packages/meteor-reactive-cache/.gitignore
vendored
Normal file
8
npm-packages/meteor-reactive-cache/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
*.swp
|
||||
*~
|
||||
*.iml
|
||||
.*.haste_cache.*
|
||||
.DS_Store
|
||||
.idea
|
||||
npm-debug.log
|
||||
node_modules
|
||||
22
npm-packages/meteor-reactive-cache/.travis.yml
Normal file
22
npm-packages/meteor-reactive-cache/.travis.yml
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
sudo: false
|
||||
language: node_js
|
||||
node_js:
|
||||
- "4.8.4"
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- xvfb
|
||||
install:
|
||||
- export DISPLAY=':99.0'
|
||||
- Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
|
||||
- npm install
|
||||
|
||||
before_install:
|
||||
- curl https://install.meteor.com/?release=1.6.1.1 | /bin/sh
|
||||
- export PATH="$HOME/.meteor:$PATH"
|
||||
|
||||
script:
|
||||
- (cd tests && meteor npm install)
|
||||
- npm run lint
|
||||
- npm test
|
||||
50
npm-packages/meteor-reactive-cache/CHANGELOG.md
Normal file
50
npm-packages/meteor-reactive-cache/CHANGELOG.md
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
# ChangeLog
|
||||
|
||||
# v1.0.7 2026-01-05 meteor-reactive-cache release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/meteor-reactive-cache/commit/eed764fb54428224a970e96e5ea12a64470ea1d2),
|
||||
[Part 2](https://github.com/wekan/meteor-reactive-cache/commit/32a496271ed45c2b3a8a26d6bde878e14b113637).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v1.0.6 2023-07-19 meteor-reactive-cache release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/meteor-reactive-cache/commit/63c2ecc549e5c985be70af70a11ae4ac614e3455).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v1.0.5 2023-07-19 meteor-reactive-cache release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fixed using newer fixed @wekanteam/meteor-globals package](https://github.com/wekan/meteor-reactive-cache/commit/1fe7a07c8607419c86bceabce5ca024432435fc2).
|
||||
Thanks to xet7.
|
||||
- [Renamed publish to release. Added release script](https://github.com/wekan/meteor-reactive-cache/commit/e43c232453c0d7267576c82c6f6463ede34a2c55).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v1.0.4 2023-07-19 meteor-reactive-cache release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Added PUBLISH.md about missing steps to publish npm package. Added missing published files also to git repo](https://github.com/wekan/meteor-reactive-cache/commit/b355ca815ebf9389d3a0dd57cddee7938aa4bf0c).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v1.0.3 2023-07-19 meteor-reactive-cache release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated dependencies in this package and @wekanteam/meteor-globals](https://github.com/wekan/meteor-reactive-cache/commit/659a4e51c11bd95ec2fc5dccfb0bf1003ca7737d).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
21
npm-packages/meteor-reactive-cache/LICENSE
Normal file
21
npm-packages/meteor-reactive-cache/LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2017 Max Nowack
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
72
npm-packages/meteor-reactive-cache/README.md
Normal file
72
npm-packages/meteor-reactive-cache/README.md
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
# meteor-reactive-cache [](https://travis-ci.org/maxnowack/meteor-reactive-cache)
|
||||
Utilities for caching reactive data
|
||||
|
||||
### Installation
|
||||
````bash
|
||||
$ npm install --save meteor-reactive-cache
|
||||
````
|
||||
|
||||
### Usage
|
||||
|
||||
#### `ReactiveCache(compare: function)`
|
||||
A simple reactive cache. It haves the same API like a `ReactiveDict`, but the values are getting deleted if all wrapped computations are stopped.
|
||||
|
||||
````es6
|
||||
import { Tracker } from 'meteor/tracker'
|
||||
import { ReactiveCache } from 'meteor-reactive-cache'
|
||||
|
||||
const reactiveCache = new ReactiveCache(/* compareFn */);
|
||||
reactiveCache.set('foo', 'bar');
|
||||
const computation = Tracker.autorun(() => {
|
||||
reactiveCache.get('foo'); // reactive!
|
||||
})
|
||||
reactiveCache.set('foo', 'new bar');
|
||||
computation.stop(); // keys will be invalidated if they don't have reactive dependants
|
||||
reactiveCache.get('foo'); // undefined
|
||||
````
|
||||
|
||||
#### `DataCache(resolve: function, { timeout: number, compare: function })`
|
||||
Provides a simple reactive data cache, by passing in a function, that resolves a key to data in a reactive context.
|
||||
|
||||
````es6
|
||||
import { Tracker } from 'meteor/tracker'
|
||||
import { DataCache } from 'meteor-reactive-cache'
|
||||
|
||||
const dataCache = new DataCache((key) => {
|
||||
// do some expensive reactive work here, which returns the same data for the same key.
|
||||
// this function will only be executed if a reactive dependency changes or the requested key isn't cached.
|
||||
|
||||
})
|
||||
const computation = Tracker.autorun(() => {
|
||||
reactiveCache.get('foo'); // reactive!
|
||||
})
|
||||
computation.stop(); // keys will be invalidated if they don't have reactive dependants
|
||||
reactiveCache.get('foo'); // undefined
|
||||
````
|
||||
|
||||
#### `reactiveField(resolve: function, { timeout: number, compare: function })`
|
||||
Like DataCache, but with a much simpler API and support for multiple function parameters.
|
||||
|
||||
````es6
|
||||
import { Tracker } from 'meteor/tracker'
|
||||
import { reactiveField } from 'meteor-reactive-cache'
|
||||
|
||||
const field = reactiveField((val1, val2, val3) => {
|
||||
// …
|
||||
})
|
||||
const computation = Tracker.autorun(() => {
|
||||
field('foo', 'bar', 1234); // reactive!
|
||||
})
|
||||
````
|
||||
|
||||
|
||||
|
||||
|
||||
## License
|
||||
Licensed under MIT license. Copyright (c) 2017 Max Nowack
|
||||
|
||||
## Contributions
|
||||
Contributions are welcome. Please open issues and/or file Pull Requests.
|
||||
|
||||
## Maintainers
|
||||
- Max Nowack ([maxnowack](https://github.com/maxnowack))
|
||||
14
npm-packages/meteor-reactive-cache/RELEASE.md
Normal file
14
npm-packages/meteor-reactive-cache/RELEASE.md
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
# Steps to release
|
||||
|
||||
## 1. Update these for new version info
|
||||
|
||||
- package.json: updated dependencies and new version info
|
||||
- package-lock.json: updated dependencies and 2x new version info
|
||||
- CHANGELOG.md: Newest changes and new version info
|
||||
- Optionally: source code at src/ directory
|
||||
|
||||
## 2. Release new version number
|
||||
|
||||
```
|
||||
./release.sh 1.0.5
|
||||
```
|
||||
92
npm-packages/meteor-reactive-cache/dist/DataCache.js
vendored
Normal file
92
npm-packages/meteor-reactive-cache/dist/DataCache.js
vendored
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
var _bindEnvironment = _interopRequireDefault(require("./meteor/bindEnvironment"));
|
||||
var _tracker = _interopRequireDefault(require("./meteor/tracker"));
|
||||
var _ReactiveCache = _interopRequireDefault(require("./ReactiveCache"));
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
||||
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
||||
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
||||
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
||||
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
||||
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
||||
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
||||
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
||||
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
||||
var DataCache = exports["default"] = /*#__PURE__*/function () {
|
||||
function DataCache(getData, options) {
|
||||
_classCallCheck(this, DataCache);
|
||||
this.options = _objectSpread({
|
||||
timeout: 60 * 1000
|
||||
}, typeof options === 'function' ? {
|
||||
compare: options
|
||||
} : options);
|
||||
this.getData = getData;
|
||||
this.cache = new _ReactiveCache["default"](this.options.compare, function () {
|
||||
return false;
|
||||
});
|
||||
this.timeouts = {};
|
||||
this.computations = {};
|
||||
}
|
||||
return _createClass(DataCache, [{
|
||||
key: "ensureComputation",
|
||||
value: function ensureComputation(key) {
|
||||
var _this = this;
|
||||
if (this.timeouts[key]) {
|
||||
clearTimeout(this.timeouts[key]);
|
||||
delete this.timeouts[key];
|
||||
}
|
||||
if (this.computations[key] && !this.computations[key].stopped) return;
|
||||
this.computations[key] = _tracker["default"].nonreactive(function () {
|
||||
return _tracker["default"].autorun(function () {
|
||||
_this.cache.set(key, _this.getData(key));
|
||||
});
|
||||
});
|
||||
|
||||
// stop the computation if the key doesn't have any dependants
|
||||
this.computations[key].onInvalidate(function () {
|
||||
return _this.checkStop(key);
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: "checkStop",
|
||||
value: function checkStop(key) {
|
||||
var _this2 = this;
|
||||
if (this.cache.ensureDependency(key).hasDependents()) return;
|
||||
if (this.timeouts[key]) {
|
||||
clearTimeout(this.timeouts[key]);
|
||||
delete this.timeouts[key];
|
||||
}
|
||||
this.timeouts[key] = setTimeout((0, _bindEnvironment["default"])(function () {
|
||||
if (!_this2.computations[key]) return;
|
||||
_this2.computations[key].stop();
|
||||
delete _this2.computations[key];
|
||||
_this2.cache.del(key);
|
||||
}), this.options.timeout);
|
||||
}
|
||||
}, {
|
||||
key: "get",
|
||||
value: function get(key) {
|
||||
var _this3 = this;
|
||||
if (!_tracker["default"].currentComputation) {
|
||||
var _data = this.cache.get(key);
|
||||
if (_data == null) {
|
||||
_data = this.getData(key);
|
||||
this.cache.set(key, _data);
|
||||
this.checkStop(key);
|
||||
}
|
||||
return _data;
|
||||
}
|
||||
this.ensureComputation(key);
|
||||
var data = this.cache.get(key);
|
||||
_tracker["default"].currentComputation.onStop(function () {
|
||||
return _this3.checkStop(key);
|
||||
});
|
||||
return data;
|
||||
}
|
||||
}]);
|
||||
}();
|
||||
84
npm-packages/meteor-reactive-cache/dist/ReactiveCache.js
vendored
Normal file
84
npm-packages/meteor-reactive-cache/dist/ReactiveCache.js
vendored
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
var _tracker = _interopRequireDefault(require("./meteor/tracker"));
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
||||
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
||||
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
||||
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
||||
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
||||
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
||||
var ReactiveCache = exports["default"] = /*#__PURE__*/function () {
|
||||
function ReactiveCache(compare, shouldStop) {
|
||||
_classCallCheck(this, ReactiveCache);
|
||||
this.shouldStop = shouldStop || function () {
|
||||
return true;
|
||||
};
|
||||
this.compare = compare || function (a, b) {
|
||||
return a === b;
|
||||
};
|
||||
this.values = {};
|
||||
this.deps = {};
|
||||
}
|
||||
return _createClass(ReactiveCache, [{
|
||||
key: "ensureDependency",
|
||||
value: function ensureDependency(key) {
|
||||
if (!this.deps[key]) this.deps[key] = new _tracker["default"].Dependency();
|
||||
return this.deps[key];
|
||||
}
|
||||
}, {
|
||||
key: "checkDeletion",
|
||||
value: function checkDeletion(key) {
|
||||
var dep = this.ensureDependency(key);
|
||||
if (dep.hasDependents()) return false;
|
||||
delete this.values[key];
|
||||
delete this.deps[key];
|
||||
return true;
|
||||
}
|
||||
}, {
|
||||
key: "clear",
|
||||
value: function clear() {
|
||||
var _this = this;
|
||||
Object.keys(this.values).forEach(function (key) {
|
||||
return _this.del(key);
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: "del",
|
||||
value: function del(key) {
|
||||
var dep = this.ensureDependency(key);
|
||||
delete this.values[key];
|
||||
if (this.checkDeletion(key)) return;
|
||||
dep.changed();
|
||||
}
|
||||
}, {
|
||||
key: "set",
|
||||
value: function set(key, data, bypassCompare) {
|
||||
var dep = this.ensureDependency(key);
|
||||
var current = this.values[key];
|
||||
this.values[key] = data;
|
||||
if (!this.compare(current, data) || bypassCompare) {
|
||||
dep.changed();
|
||||
}
|
||||
}
|
||||
}, {
|
||||
key: "get",
|
||||
value: function get(key) {
|
||||
var _this2 = this;
|
||||
var data = this.values[key];
|
||||
if (_tracker["default"].currentComputation) {
|
||||
var dep = this.ensureDependency(key);
|
||||
dep.depend();
|
||||
_tracker["default"].currentComputation.onStop(function () {
|
||||
if (!_this2.shouldStop(key)) return;
|
||||
_this2.checkDeletion(key);
|
||||
});
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}]);
|
||||
}();
|
||||
27
npm-packages/meteor-reactive-cache/dist/index.js
vendored
Normal file
27
npm-packages/meteor-reactive-cache/dist/index.js
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
Object.defineProperty(exports, "DataCache", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _DataCache["default"];
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "ReactiveCache", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _ReactiveCache["default"];
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "reactiveField", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _reactiveField["default"];
|
||||
}
|
||||
});
|
||||
var _DataCache = _interopRequireDefault(require("./DataCache"));
|
||||
var _ReactiveCache = _interopRequireDefault(require("./ReactiveCache"));
|
||||
var _reactiveField = _interopRequireDefault(require("./reactiveField"));
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
9
npm-packages/meteor-reactive-cache/dist/meteor/bindEnvironment.js
vendored
Normal file
9
npm-packages/meteor-reactive-cache/dist/meteor/bindEnvironment.js
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
var _meteorGlobals = require("@wekanteam/meteor-globals");
|
||||
var Meteor = (0, _meteorGlobals.getGlobal)('meteor', 'Meteor');
|
||||
var _default = exports["default"] = Meteor.bindEnvironment.bind(Meteor);
|
||||
8
npm-packages/meteor-reactive-cache/dist/meteor/ejson.js
vendored
Normal file
8
npm-packages/meteor-reactive-cache/dist/meteor/ejson.js
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
var _meteorGlobals = require("@wekanteam/meteor-globals");
|
||||
var _default = exports["default"] = (0, _meteorGlobals.getGlobal)('ejson', 'EJSON');
|
||||
8
npm-packages/meteor-reactive-cache/dist/meteor/tracker.js
vendored
Normal file
8
npm-packages/meteor-reactive-cache/dist/meteor/tracker.js
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
var _meteorGlobals = require("@wekanteam/meteor-globals");
|
||||
var _default = exports["default"] = (0, _meteorGlobals.getGlobal)('tracker', 'Tracker');
|
||||
28
npm-packages/meteor-reactive-cache/dist/reactiveField.js
vendored
Normal file
28
npm-packages/meteor-reactive-cache/dist/reactiveField.js
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
var _DataCache = _interopRequireDefault(require("./DataCache"));
|
||||
var _ejson = _interopRequireDefault(require("./meteor/ejson"));
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
||||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||||
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
||||
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
||||
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
||||
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
||||
var _default = exports["default"] = function _default(fn, compare) {
|
||||
var cache = new _DataCache["default"](function (key) {
|
||||
return fn.apply(void 0, _toConsumableArray(_ejson["default"].parse(key)));
|
||||
}, compare);
|
||||
var resolver = function resolver() {
|
||||
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
||||
args[_key] = arguments[_key];
|
||||
}
|
||||
return cache.get(_ejson["default"].stringify(args));
|
||||
};
|
||||
resolver.cache = cache;
|
||||
return resolver;
|
||||
};
|
||||
3710
npm-packages/meteor-reactive-cache/package-lock.json
generated
Normal file
3710
npm-packages/meteor-reactive-cache/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
63
npm-packages/meteor-reactive-cache/package.json
Normal file
63
npm-packages/meteor-reactive-cache/package.json
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
{
|
||||
"name": "@wekanteam/meteor-reactive-cache",
|
||||
"version": "1.0.7",
|
||||
"description": "Utilities for caching reactive data",
|
||||
"main": "dist/index.js",
|
||||
"scripts": {
|
||||
"prepublish": "./node_modules/.bin/babel src -d dist",
|
||||
"lint": "./node_modules/.bin/eslint src",
|
||||
"copy": "npm link && cd tests && npm link meteor-reactive-cache",
|
||||
"test": "npm run copy && cd tests && TEST_BROWSER_DRIVER=nightmare meteor test -p 3100 --once --driver-package meteortesting:mocha"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/maxnowack/meteor-reactive-cache.git"
|
||||
},
|
||||
"author": "Max Nowack <max@unsou.de>",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/maxnowack/meteor-reactive-cache/issues"
|
||||
},
|
||||
"homepage": "https://github.com/maxnowack/meteor-reactive-cache#readme",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"keywords": [
|
||||
"caching",
|
||||
"meteor",
|
||||
"react",
|
||||
"reactivity",
|
||||
"tracker"
|
||||
],
|
||||
"babel": {
|
||||
"presets": [
|
||||
"@babel/preset-env"
|
||||
]
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"airbnb-base"
|
||||
],
|
||||
"parser": "@babel/eslint-parser",
|
||||
"rules": {
|
||||
"no-param-reassign": [
|
||||
2,
|
||||
{
|
||||
"props": false
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.23.9",
|
||||
"@babel/core": "^7.23.9",
|
||||
"@babel/eslint-parser": "^7.23.9",
|
||||
"@babel/preset-env": "^7.23.9",
|
||||
"eslint": "^8.56.0",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-plugin-import": "^2.29.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@wekanteam/meteor-globals": "^1.1.6"
|
||||
}
|
||||
}
|
||||
25
npm-packages/meteor-reactive-cache/release.sh
Executable file
25
npm-packages/meteor-reactive-cache/release.sh
Executable file
|
|
@ -0,0 +1,25 @@
|
|||
#!/bin/bash
|
||||
|
||||
## 1. Copy files
|
||||
|
||||
npm run prepublish
|
||||
|
||||
npm run copy
|
||||
|
||||
## 2. Commit
|
||||
|
||||
git add --all
|
||||
|
||||
git commit -m "$1"
|
||||
|
||||
## 3. Add tags
|
||||
|
||||
git tag -a $1 -m "$1"
|
||||
|
||||
git push origin $1
|
||||
|
||||
git push
|
||||
|
||||
## 4. Publish npm package
|
||||
|
||||
npm publish --access public
|
||||
61
npm-packages/meteor-reactive-cache/src/DataCache.js
Normal file
61
npm-packages/meteor-reactive-cache/src/DataCache.js
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
import bindEnvironment from './meteor/bindEnvironment';
|
||||
import Tracker from './meteor/tracker';
|
||||
import ReactiveCache from './ReactiveCache';
|
||||
|
||||
export default class DataCache {
|
||||
constructor(getData, options) {
|
||||
this.options = {
|
||||
timeout: 60 * 1000, // 60 seconds
|
||||
...(typeof options === 'function' ? { compare: options } : options),
|
||||
};
|
||||
|
||||
this.getData = getData;
|
||||
this.cache = new ReactiveCache(this.options.compare, () => false);
|
||||
this.timeouts = {};
|
||||
this.computations = {};
|
||||
}
|
||||
|
||||
ensureComputation(key) {
|
||||
if (this.timeouts[key]) {
|
||||
clearTimeout(this.timeouts[key]);
|
||||
delete this.timeouts[key];
|
||||
}
|
||||
if (this.computations[key] && !this.computations[key].stopped) return;
|
||||
this.computations[key] = Tracker.nonreactive(() => Tracker.autorun(() => {
|
||||
this.cache.set(key, this.getData(key));
|
||||
}));
|
||||
|
||||
// stop the computation if the key doesn't have any dependants
|
||||
this.computations[key].onInvalidate(() => this.checkStop(key));
|
||||
}
|
||||
|
||||
checkStop(key) {
|
||||
if (this.cache.ensureDependency(key).hasDependents()) return;
|
||||
if (this.timeouts[key]) {
|
||||
clearTimeout(this.timeouts[key]);
|
||||
delete this.timeouts[key];
|
||||
}
|
||||
this.timeouts[key] = setTimeout(bindEnvironment(() => {
|
||||
if (!this.computations[key]) return;
|
||||
this.computations[key].stop();
|
||||
delete this.computations[key];
|
||||
this.cache.del(key);
|
||||
}), this.options.timeout);
|
||||
}
|
||||
|
||||
get(key) {
|
||||
if (!Tracker.currentComputation) {
|
||||
let data = this.cache.get(key);
|
||||
if (data == null) {
|
||||
data = this.getData(key);
|
||||
this.cache.set(key, data);
|
||||
this.checkStop(key);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
this.ensureComputation(key);
|
||||
const data = this.cache.get(key);
|
||||
Tracker.currentComputation.onStop(() => this.checkStop(key));
|
||||
return data;
|
||||
}
|
||||
}
|
||||
56
npm-packages/meteor-reactive-cache/src/ReactiveCache.js
Normal file
56
npm-packages/meteor-reactive-cache/src/ReactiveCache.js
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
import Tracker from './meteor/tracker';
|
||||
|
||||
export default class ReactiveCache {
|
||||
constructor(compare, shouldStop) {
|
||||
this.shouldStop = shouldStop || (() => true);
|
||||
this.compare = compare || ((a, b) => a === b);
|
||||
this.values = {};
|
||||
this.deps = {};
|
||||
}
|
||||
|
||||
ensureDependency(key) {
|
||||
if (!this.deps[key]) this.deps[key] = new Tracker.Dependency();
|
||||
return this.deps[key];
|
||||
}
|
||||
|
||||
checkDeletion(key) {
|
||||
const dep = this.ensureDependency(key);
|
||||
if (dep.hasDependents()) return false;
|
||||
delete this.values[key];
|
||||
delete this.deps[key];
|
||||
return true;
|
||||
}
|
||||
|
||||
clear() {
|
||||
Object.keys(this.values).forEach((key) => this.del(key));
|
||||
}
|
||||
|
||||
del(key) {
|
||||
const dep = this.ensureDependency(key);
|
||||
delete this.values[key];
|
||||
if (this.checkDeletion(key)) return;
|
||||
dep.changed();
|
||||
}
|
||||
|
||||
set(key, data, bypassCompare) {
|
||||
const dep = this.ensureDependency(key);
|
||||
const current = this.values[key];
|
||||
this.values[key] = data;
|
||||
if (!this.compare(current, data) || bypassCompare) {
|
||||
dep.changed();
|
||||
}
|
||||
}
|
||||
|
||||
get(key) {
|
||||
const data = this.values[key];
|
||||
if (Tracker.currentComputation) {
|
||||
const dep = this.ensureDependency(key);
|
||||
dep.depend();
|
||||
Tracker.currentComputation.onStop(() => {
|
||||
if (!this.shouldStop(key)) return;
|
||||
this.checkDeletion(key);
|
||||
});
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
3
npm-packages/meteor-reactive-cache/src/index.js
Normal file
3
npm-packages/meteor-reactive-cache/src/index.js
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
export { default as DataCache } from './DataCache';
|
||||
export { default as ReactiveCache } from './ReactiveCache';
|
||||
export { default as reactiveField } from './reactiveField';
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
import { getGlobal } from '@wekanteam/meteor-globals';
|
||||
|
||||
const Meteor = getGlobal('meteor', 'Meteor');
|
||||
export default Meteor.bindEnvironment.bind(Meteor);
|
||||
3
npm-packages/meteor-reactive-cache/src/meteor/ejson.js
Normal file
3
npm-packages/meteor-reactive-cache/src/meteor/ejson.js
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
import { getGlobal } from '@wekanteam/meteor-globals';
|
||||
|
||||
export default getGlobal('ejson', 'EJSON');
|
||||
3
npm-packages/meteor-reactive-cache/src/meteor/tracker.js
Normal file
3
npm-packages/meteor-reactive-cache/src/meteor/tracker.js
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
import { getGlobal } from '@wekanteam/meteor-globals';
|
||||
|
||||
export default getGlobal('tracker', 'Tracker');
|
||||
9
npm-packages/meteor-reactive-cache/src/reactiveField.js
Normal file
9
npm-packages/meteor-reactive-cache/src/reactiveField.js
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
import DataCache from './DataCache';
|
||||
import ejson from './meteor/ejson';
|
||||
|
||||
export default (fn, compare) => {
|
||||
const cache = new DataCache((key) => fn(...ejson.parse(key)), compare);
|
||||
const resolver = (...args) => cache.get(ejson.stringify(args));
|
||||
resolver.cache = cache;
|
||||
return resolver;
|
||||
};
|
||||
0
npm-packages/meteor-reactive-cache/tests/.gitignore
vendored
Normal file
0
npm-packages/meteor-reactive-cache/tests/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# This file contains information which helps Meteor properly upgrade your
|
||||
# app when you run 'meteor update'. You should check it into version control
|
||||
# with your project.
|
||||
|
||||
notices-for-0.9.0
|
||||
notices-for-0.9.1
|
||||
0.9.4-platform-file
|
||||
notices-for-facebook-graph-api-2
|
||||
1.2.0-standard-minifiers-package
|
||||
1.2.0-meteor-platform-split
|
||||
1.2.0-cordova-changes
|
||||
1.2.0-breaking-changes
|
||||
1.3.0-split-minifiers-package
|
||||
1.4.0-remove-old-dev-bundle-link
|
||||
1.4.1-add-shell-server-package
|
||||
1.4.3-split-account-service-packages
|
||||
1.5-add-dynamic-import-package
|
||||
1.7-split-underscore-from-meteor-base
|
||||
1
npm-packages/meteor-reactive-cache/tests/.meteor/.gitignore
vendored
Normal file
1
npm-packages/meteor-reactive-cache/tests/.meteor/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
local
|
||||
7
npm-packages/meteor-reactive-cache/tests/.meteor/.id
Normal file
7
npm-packages/meteor-reactive-cache/tests/.meteor/.id
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# This file contains a token that is unique to your project.
|
||||
# Check it into your repository along with the rest of this directory.
|
||||
# It can be used for purposes such as:
|
||||
# - ensuring you don't accidentally deploy one app on top of another
|
||||
# - providing package authors with aggregated statistics
|
||||
|
||||
1efzo9epsn1ob1vv1hyv
|
||||
18
npm-packages/meteor-reactive-cache/tests/.meteor/packages
Normal file
18
npm-packages/meteor-reactive-cache/tests/.meteor/packages
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# Meteor packages used by this project, one per line.
|
||||
# Check this file (and the other files in this directory) into your repository.
|
||||
#
|
||||
# 'meteor add' and 'meteor remove' will edit this file for you,
|
||||
# but you can also edit it by hand.
|
||||
|
||||
meteor-base@1.4.0 # Packages every Meteor app needs to have
|
||||
reactive-var@1.0.11 # Reactive variable for tracker
|
||||
tracker@1.2.0 # Meteor's client-side reactive programming library
|
||||
|
||||
standard-minifier-css@1.5.2 # CSS minifier run for production mode
|
||||
standard-minifier-js@2.4.0 # JS minifier run for production mode
|
||||
es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers.
|
||||
ecmascript@0.12.3 # Enable ECMAScript2015+ syntax in app code
|
||||
shell-server@0.4.0 # Server-side component of the `meteor shell` command
|
||||
reactive-dict@1.2.1
|
||||
dynamic-import@0.5.0
|
||||
meteortesting:mocha
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
server
|
||||
browser
|
||||
1
npm-packages/meteor-reactive-cache/tests/.meteor/release
Normal file
1
npm-packages/meteor-reactive-cache/tests/.meteor/release
Normal file
|
|
@ -0,0 +1 @@
|
|||
METEOR@1.8.0.1
|
||||
63
npm-packages/meteor-reactive-cache/tests/.meteor/versions
Normal file
63
npm-packages/meteor-reactive-cache/tests/.meteor/versions
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
allow-deny@1.1.0
|
||||
autoupdate@1.5.0
|
||||
babel-compiler@7.2.3
|
||||
babel-runtime@1.3.0
|
||||
base64@1.0.11
|
||||
binary-heap@1.0.11
|
||||
boilerplate-generator@1.6.0
|
||||
callback-hook@1.1.0
|
||||
check@1.3.1
|
||||
ddp@1.4.0
|
||||
ddp-client@2.3.3
|
||||
ddp-common@1.4.0
|
||||
ddp-server@2.2.0
|
||||
diff-sequence@1.1.1
|
||||
dynamic-import@0.5.1
|
||||
ecmascript@0.12.3
|
||||
ecmascript-runtime@0.7.0
|
||||
ecmascript-runtime-client@0.8.0
|
||||
ecmascript-runtime-server@0.7.1
|
||||
ejson@1.1.0
|
||||
es5-shim@4.8.0
|
||||
fetch@0.1.0
|
||||
geojson-utils@1.0.10
|
||||
hot-code-push@1.0.4
|
||||
http@1.4.2
|
||||
id-map@1.1.0
|
||||
inter-process-messaging@0.1.0
|
||||
livedata@1.0.18
|
||||
lmieulet:meteor-coverage@2.0.2
|
||||
logging@1.1.20
|
||||
meteor@1.9.2
|
||||
meteor-base@1.4.0
|
||||
meteortesting:browser-tests@1.2.0
|
||||
meteortesting:mocha@1.1.0
|
||||
meteortesting:mocha-core@5.2.0_3
|
||||
minifier-css@1.4.1
|
||||
minifier-js@2.4.0
|
||||
minimongo@1.4.5
|
||||
modern-browsers@0.1.3
|
||||
modules@0.13.0
|
||||
modules-runtime@0.10.3
|
||||
mongo@1.6.0
|
||||
mongo-decimal@0.1.0
|
||||
mongo-dev-server@1.1.0
|
||||
mongo-id@1.0.7
|
||||
npm-mongo@3.1.1
|
||||
ordered-dict@1.1.0
|
||||
promise@0.11.1
|
||||
random@1.1.0
|
||||
reactive-dict@1.2.1
|
||||
reactive-var@1.0.11
|
||||
reload@1.2.0
|
||||
retry@1.1.0
|
||||
routepolicy@1.1.0
|
||||
shell-server@0.4.0
|
||||
socket-stream-client@0.2.2
|
||||
standard-minifier-css@1.5.2
|
||||
standard-minifier-js@2.4.0
|
||||
tracker@1.2.0
|
||||
underscore@1.0.10
|
||||
url@1.2.0
|
||||
webapp@1.7.2
|
||||
webapp-hashing@1.0.9
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
/* global describe it */
|
||||
import chai from 'chai';
|
||||
import { DataCache } from 'meteor-reactive-cache';
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
import { Tracker } from 'meteor/tracker';
|
||||
import { ReactiveDict } from 'meteor/reactive-dict';
|
||||
|
||||
describe('DataCache', () => {
|
||||
it('should be reactive', (done) => {
|
||||
const reactiveDict = new ReactiveDict();
|
||||
reactiveDict.set('foo', '000');
|
||||
let numGets = 0;
|
||||
const reactiveCache = new DataCache((key) => {
|
||||
numGets += 1;
|
||||
return reactiveDict.get(key);
|
||||
}, {
|
||||
timeout: 10,
|
||||
});
|
||||
|
||||
let runs = 0;
|
||||
const computation = Tracker.autorun(() => {
|
||||
runs += 1;
|
||||
const value = reactiveCache.get('foo'); // eslint-disable-line
|
||||
});
|
||||
|
||||
chai.assert.equal(reactiveCache.get('foo'), '000');
|
||||
chai.assert.equal(numGets, 1);
|
||||
chai.assert.equal(runs, 1);
|
||||
|
||||
reactiveDict.set('foo', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(reactiveCache.get('foo'), 'bar');
|
||||
chai.assert.equal(numGets, 2);
|
||||
chai.assert.equal(runs, 2);
|
||||
|
||||
reactiveDict.set('foo', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(reactiveCache.get('foo'), 'bar');
|
||||
chai.assert.equal(numGets, 2);
|
||||
chai.assert.equal(runs, 2);
|
||||
|
||||
|
||||
computation.stop();
|
||||
|
||||
chai.assert.equal(reactiveCache.get('foo'), 'bar');
|
||||
chai.assert.equal(numGets, 2);
|
||||
|
||||
Meteor.setTimeout(() => {
|
||||
chai.assert.equal(reactiveCache.get('foo'), 'bar');
|
||||
chai.assert.equal(numGets, 3);
|
||||
done();
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
/* global describe it */
|
||||
import chai from 'chai';
|
||||
import { ReactiveCache } from 'meteor-reactive-cache';
|
||||
import { Tracker } from 'meteor/tracker';
|
||||
import isEqual from 'lodash.isequal';
|
||||
|
||||
describe('ReactiveCache', () => {
|
||||
it('should be reactive', () => {
|
||||
const reactiveCache = new ReactiveCache();
|
||||
|
||||
let runs = 0;
|
||||
Tracker.autorun(() => {
|
||||
runs += 1;
|
||||
const value = reactiveCache.get('foo'); // eslint-disable-line
|
||||
});
|
||||
|
||||
chai.assert.equal(typeof reactiveCache.get('foo'), 'undefined');
|
||||
chai.assert.equal(runs, 1);
|
||||
|
||||
reactiveCache.set('foo', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(reactiveCache.get('foo'), 'bar');
|
||||
chai.assert.equal(runs, 2);
|
||||
|
||||
reactiveCache.set('foo', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(reactiveCache.get('foo'), 'bar');
|
||||
chai.assert.equal(runs, 2);
|
||||
|
||||
reactiveCache.del('foo');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(typeof reactiveCache.get('foo'), 'undefined');
|
||||
chai.assert.equal(runs, 3);
|
||||
});
|
||||
|
||||
it('should be reactive with custom compare', () => {
|
||||
const reactiveCache = new ReactiveCache();
|
||||
const reactiveObjCache = new ReactiveCache((a, b) => isEqual(a, b));
|
||||
|
||||
reactiveCache.set('foo', { test: true });
|
||||
reactiveObjCache.set('foo', { test: true });
|
||||
|
||||
let runs = 0;
|
||||
Tracker.autorun(() => {
|
||||
runs += 1;
|
||||
const value = reactiveCache.get('foo'); // eslint-disable-line
|
||||
});
|
||||
|
||||
let runsObj = 0;
|
||||
Tracker.autorun(() => {
|
||||
runsObj += 1;
|
||||
const value = reactiveObjCache.get('foo'); // eslint-disable-line
|
||||
});
|
||||
|
||||
chai.assert.equal(runs, 1);
|
||||
chai.assert.equal(runsObj, 1);
|
||||
|
||||
reactiveCache.set('foo', { test: true });
|
||||
reactiveObjCache.set('foo', { test: true });
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
|
||||
chai.assert.equal(runs, 2);
|
||||
chai.assert.equal(runsObj, 1);
|
||||
});
|
||||
|
||||
it('gets invalidated if computation stops', (done) => {
|
||||
const reactiveCache = new ReactiveCache();
|
||||
|
||||
let runs = 0;
|
||||
const computation = Tracker.autorun(() => {
|
||||
runs += 1;
|
||||
const value = reactiveCache.get('foo'); // eslint-disable-line
|
||||
});
|
||||
|
||||
chai.assert.equal(typeof reactiveCache.get('foo'), 'undefined');
|
||||
chai.assert.equal(runs, 1);
|
||||
|
||||
reactiveCache.set('foo', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(reactiveCache.get('foo'), 'bar');
|
||||
chai.assert.equal(runs, 2);
|
||||
|
||||
computation.stop();
|
||||
chai.assert.equal(typeof reactiveCache.get('foo'), 'undefined');
|
||||
setTimeout(() => {
|
||||
done();
|
||||
}, 200);
|
||||
});
|
||||
});
|
||||
|
|
@ -0,0 +1,154 @@
|
|||
/* global describe it */
|
||||
import chai from 'chai';
|
||||
import { reactiveField } from 'meteor-reactive-cache';
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
import { Tracker } from 'meteor/tracker';
|
||||
import { ReactiveVar } from 'meteor/reactive-var';
|
||||
import { ReactiveDict } from 'meteor/reactive-dict';
|
||||
|
||||
describe('reactiveField', () => {
|
||||
it('should be reactive', (done) => {
|
||||
const reactiveDict = new ReactiveDict();
|
||||
reactiveDict.set('foo', '000');
|
||||
let numGets = 0;
|
||||
const field = reactiveField((key) => {
|
||||
numGets += 1;
|
||||
return reactiveDict.get(key);
|
||||
}, {
|
||||
timeout: 10,
|
||||
});
|
||||
|
||||
let runs = 0;
|
||||
const computation = Tracker.autorun(() => {
|
||||
runs += 1;
|
||||
const value = field('foo'); // eslint-disable-line
|
||||
});
|
||||
|
||||
chai.assert.equal(field('foo'), '000');
|
||||
chai.assert.equal(numGets, 1);
|
||||
chai.assert.equal(runs, 1);
|
||||
|
||||
reactiveDict.set('foo', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(field('foo'), 'bar');
|
||||
chai.assert.equal(numGets, 2);
|
||||
chai.assert.equal(runs, 2);
|
||||
|
||||
reactiveDict.set('foo', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(field('foo'), 'bar');
|
||||
chai.assert.equal(numGets, 2);
|
||||
chai.assert.equal(runs, 2);
|
||||
|
||||
|
||||
computation.stop();
|
||||
|
||||
chai.assert.equal(field('foo'), 'bar');
|
||||
chai.assert.equal(numGets, 2);
|
||||
|
||||
Meteor.setTimeout(() => {
|
||||
chai.assert.equal(field('foo'), 'bar');
|
||||
chai.assert.equal(numGets, 3);
|
||||
done();
|
||||
}, 50);
|
||||
});
|
||||
|
||||
it('should be reactive with complex values', () => {
|
||||
const reactiveDict = new ReactiveDict();
|
||||
reactiveDict.set('foo', { date: new Date('2018-01-01') });
|
||||
let numGets = 0;
|
||||
const field = reactiveField((key) => {
|
||||
numGets += 1;
|
||||
return reactiveDict.get(key);
|
||||
}, {
|
||||
timeout: 10,
|
||||
});
|
||||
|
||||
let runs = 0;
|
||||
const computation = Tracker.autorun(() => {
|
||||
runs += 1;
|
||||
const value = field('foo'); // eslint-disable-line
|
||||
});
|
||||
|
||||
chai.assert.instanceOf(field('foo').date, Date);
|
||||
chai.assert.equal(numGets, 1);
|
||||
chai.assert.equal(runs, 1);
|
||||
|
||||
reactiveDict.set('foo', { date: new Date('2018-01-02') });
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.instanceOf(field('foo').date, Date);
|
||||
chai.assert.equal(numGets, 2);
|
||||
chai.assert.equal(runs, 2);
|
||||
|
||||
computation.stop();
|
||||
});
|
||||
|
||||
it('should work with multiple parameters', () => {
|
||||
const reactiveDict = new ReactiveDict();
|
||||
reactiveDict.set('foofoo', '000');
|
||||
reactiveDict.set('foobar', '000');
|
||||
reactiveDict.set('barbar', '000');
|
||||
let numGets = 0;
|
||||
const field = reactiveField((val1, val2) => {
|
||||
numGets += 1;
|
||||
return reactiveDict.get(`${val1}${val2}`);
|
||||
}, {
|
||||
timeout: 100,
|
||||
});
|
||||
|
||||
const runs = {
|
||||
foofoo: 0,
|
||||
foobar: 0,
|
||||
barbar: 0,
|
||||
};
|
||||
|
||||
Tracker.autorun(() => {
|
||||
runs.foofoo += 1;
|
||||
const value = field('foo', 'foo'); // eslint-disable-line
|
||||
});
|
||||
Tracker.autorun(() => {
|
||||
runs.foobar += 1;
|
||||
const value = field('foo', 'bar'); // eslint-disable-line
|
||||
});
|
||||
Tracker.autorun(() => {
|
||||
runs.barbar += 1;
|
||||
const value = field('bar', 'bar'); // eslint-disable-line
|
||||
});
|
||||
|
||||
chai.assert.equal(field('foo', 'foo'), '000');
|
||||
chai.assert.equal(numGets, 3);
|
||||
chai.assert.equal(runs.foofoo, 1);
|
||||
|
||||
chai.assert.equal(field('foo', 'bar'), '000');
|
||||
chai.assert.equal(numGets, 3);
|
||||
chai.assert.equal(runs.foobar, 1);
|
||||
|
||||
chai.assert.equal(field('bar', 'bar'), '000');
|
||||
chai.assert.equal(numGets, 3);
|
||||
chai.assert.equal(runs.barbar, 1);
|
||||
|
||||
reactiveDict.set('foofoo', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(field('foo', 'foo'), 'bar');
|
||||
chai.assert.equal(numGets, 4);
|
||||
chai.assert.equal(runs.foofoo, 2);
|
||||
chai.assert.equal(runs.foobar, 1);
|
||||
chai.assert.equal(runs.barbar, 1);
|
||||
|
||||
reactiveDict.set('foobar', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(field('foo', 'bar'), 'bar');
|
||||
chai.assert.equal(numGets, 5);
|
||||
chai.assert.equal(runs.foofoo, 2);
|
||||
chai.assert.equal(runs.foobar, 2);
|
||||
chai.assert.equal(runs.barbar, 1);
|
||||
|
||||
reactiveDict.set('barbar', 'bar');
|
||||
Tracker.flush({ _throwFirstError: true });
|
||||
chai.assert.equal(field('bar', 'bar'), 'bar');
|
||||
chai.assert.equal(numGets, 6);
|
||||
chai.assert.equal(runs.foofoo, 2);
|
||||
chai.assert.equal(runs.foobar, 2);
|
||||
chai.assert.equal(runs.barbar, 2);
|
||||
});
|
||||
});
|
||||
3351
npm-packages/meteor-reactive-cache/tests/package-lock.json
generated
Normal file
3351
npm-packages/meteor-reactive-cache/tests/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
39
npm-packages/meteor-reactive-cache/tests/package.json
Normal file
39
npm-packages/meteor-reactive-cache/tests/package.json
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
{
|
||||
"name": "tests",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "meteor run"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"airbnb-base",
|
||||
"plugin:meteor/recommended"
|
||||
],
|
||||
"plugins": [
|
||||
"meteor"
|
||||
],
|
||||
"parser": "babel-eslint",
|
||||
"rules": {
|
||||
"meteor/audit-argument-checks": 0,
|
||||
"import/no-extraneous-dependencies": 0,
|
||||
"import/extensions": 0,
|
||||
"import/no-unresolved": 0,
|
||||
"no-underscore-dangle": 0
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.1.5",
|
||||
"meteor-node-stubs": "0.4.1",
|
||||
"meteor-reactive-cache": "^1.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"chai": "^4.2.0",
|
||||
"eslint": "5.9.0",
|
||||
"eslint-config-airbnb-base": "13.1.0",
|
||||
"eslint-plugin-import": "2.14.0",
|
||||
"eslint-plugin-meteor": "5.1.0",
|
||||
"lodash.isequal": "^4.5.0",
|
||||
"mocha": "^5.2.0",
|
||||
"nightmare": "3.0.1"
|
||||
}
|
||||
}
|
||||
2189
npm-packages/meteor-reactive-cache/yarn.lock
Normal file
2189
npm-packages/meteor-reactive-cache/yarn.lock
Normal file
File diff suppressed because it is too large
Load diff
4
package-lock.json
generated
4
package-lock.json
generated
|
|
@ -205,9 +205,7 @@
|
|||
}
|
||||
},
|
||||
"@wekanteam/meteor-reactive-cache": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@wekanteam/meteor-reactive-cache/-/meteor-reactive-cache-1.0.7.tgz",
|
||||
"integrity": "sha512-PSxoCX46sGcLygaKN/i/DrtPbKbm8AOnuNzK8lBE1BQTFkdnr7KBG2neGjFDbwLRHGmvvSfYStUmPtAk6xfx8w==",
|
||||
"version": "file:npm-packages/meteor-reactive-cache",
|
||||
"requires": {
|
||||
"@wekanteam/meteor-globals": "^1.1.6"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
"@wekanteam/exceljs": "^4.6.0",
|
||||
"@wekanteam/html-to-markdown": "^1.0.2",
|
||||
"@wekanteam/meteor-globals": "^1.1.6",
|
||||
"@wekanteam/meteor-reactive-cache": "^1.0.7",
|
||||
"@wekanteam/meteor-reactive-cache": "file:./npm-packages/meteor-reactive-cache",
|
||||
"ajv": "^6.12.6",
|
||||
"bcryptjs": "^2.4.3",
|
||||
"bson": "^4.7.2",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue