Skip to content

Commit dea2e98

Browse files
committed
feat(calc): Allow to use promises via promiseCalc flag
1 parent d2c9d48 commit dea2e98

File tree

8 files changed

+101
-15
lines changed

8 files changed

+101
-15
lines changed

.babelrc

+13-8
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,17 @@
1111
["transform-es2015-template-literals", { "loose": true }],
1212
["transform-es2015-destructuring", { "loose": true }],
1313
["transform-es2015-computed-properties", { "loose": true }],
14-
15-
// the following plugins are used at tests
16-
"transform-es2015-classes",
17-
"transform-es2015-for-of",
18-
["transform-es2015-spread", {
19-
"loose": true
20-
}]
21-
]
14+
],
15+
"env": {
16+
"test": {
17+
"plugins": [
18+
"transform-es2015-classes",
19+
"transform-es2015-for-of",
20+
"babel-plugin-transform-async-to-generator",
21+
["transform-es2015-spread", {
22+
"loose": true
23+
}]
24+
]
25+
}
26+
}
2227
}

.eslintrc.js

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module.exports = {
66
rules: {
77
indent: ['error', 4, { 'SwitchCase': 1 }],
88
'no-var': 'error',
9+
'no-console': 'error',
910
'prefer-rest-params': 0, // arguments work faster
1011
'no-param-reassign': ["error", { "props": false }],
1112
'no-underscore-dangle': 0, // for some hacks and array methods underscore prefix/suffix is required

package.json

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
"main": "matreshka.js",
77
"scripts": {
88
"test": "npm run node-cover && npm run check-coverage && npm run lint",
9-
"node-test": "babel-node test/node-test/jasmine.js",
10-
"node-cover": "babel-node node_modules/.bin/babel-istanbul cover test/node-test/jasmine.js && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
9+
"node-test": "BABEL_ENV=test babel-node test/node-test/jasmine.js",
10+
"node-cover": "BABEL_ENV=test babel-node node_modules/.bin/babel-istanbul cover test/node-test/jasmine.js && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
1111
"check-coverage": "babel-istanbul check-coverage --lines 95",
1212
"develop": "CHROME_BIN=chromium-browser karma start test/karma-test/karma.conf.js",
13-
"karma-test": "CHROME_BIN=chromium-browser karma start test/karma-test/karma.conf.js --single-run --no-auto-watch",
13+
"karma-test": "BABEL_ENV=test CHROME_BIN=chromium-browser karma start test/karma-test/karma.conf.js --single-run --no-auto-watch",
1414
"karma-libraries-test": "npm run karma-test && npm run karma-test -- --dom-library=jquery-1 && npm run karma-test -- --dom-library=jquery-2 && npm run karma-test -- --dom-library=jquery-3 && npm run karma-test -- --dom-library=zepto",
1515
"watch": "webpack --config ./webpack.config.js --watch",
1616
"watch-browser-test": "webpack --config test/webpack-test.config.js --watch",
@@ -25,7 +25,7 @@
2525
"npm-deploy": "npm run npm-compile && npm run npm-deploy-setup && npm run npm-publish",
2626
"bundle": "webpack --config ./webpack.config.js",
2727
"deploy-to-git": "shx rm -rf bundle && deploy-to-git",
28-
"bundle-browser-test": "webpack --config test/webpack-test.config.js",
28+
"bundle-browser-test": "BABEL_ENV=test webpack --config test/webpack-test.config.js",
2929
"bundle-deploy-script": "npm run bundle && npm run bundle-browser-test",
3030
"upgrade": "ncu -u -a && yarn install"
3131
},
@@ -83,6 +83,7 @@
8383
"babel-loader": "^6.4.1",
8484
"babel-plugin-check-es2015-constants": "^6.22.0",
8585
"babel-plugin-nofn": "0.0.3",
86+
"babel-plugin-transform-async-to-generator": "^6.24.1",
8687
"babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
8788
"babel-plugin-transform-es2015-block-scoping": "^6.24.1",
8889
"babel-plugin-transform-es2015-classes": "^6.24.1",

src/calc/_createcalchandler.js

+16-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export default function createCalcHandler({
1515
const values = [];
1616
const { protector = {} } = changeEvent;
1717
const protectKey = target + def.id;
18+
const { promiseCalc } = eventOptions;
1819
const setEventOptions = {
1920
protector,
2021
...eventOptions,
@@ -36,7 +37,20 @@ export default function createCalcHandler({
3637
values.push(value);
3738
});
3839

39-
const targetValue = apply(handler, object, values);
40-
set(object, target, targetValue, setEventOptions);
40+
let targetValue = apply(handler, object, values);
41+
42+
if (promiseCalc) {
43+
if (!(targetValue instanceof Promise)) {
44+
targetValue = Promise.resolve(targetValue);
45+
}
46+
47+
targetValue
48+
.then(promiseResult => set(object, target, promiseResult, setEventOptions))
49+
.catch((e) => {
50+
throw Error(e);
51+
});
52+
} else {
53+
set(object, target, targetValue, setEventOptions);
54+
}
4155
};
4256
}

test/browser-test/SpecRunner.html

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<script src="jasmine-2.4.1/jasmine.js"></script>
1111
<script src="jasmine-2.4.1/jasmine-html.js"></script>
1212
<script src="jasmine-2.4.1/boot.js"></script>
13+
<script src="es6-promise.min.js"></script>
1314
</head>
1415

1516
<body>

test/spec/bindings/existence_binder_spec.js

-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ describe('Existence binder', () => {
110110

111111
for (const item of arr) {
112112
bindNode(item, 'exists', ':sandbox', existence(), noDebounceFlag);
113-
console.log(select(item, ':sandbox').__matreshkaReplacedByNode);
114113
}
115114

116115
expect(

test/spec/calc_spec.js

+43
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import makeObject from '../helpers/makeobject';
55
import createSpy from '../helpers/createspy';
66

77
const noDebounceFlag = { debounceCalc: false };
8+
const delay = duration => new Promise(resolve => setTimeout(resolve, duration));
89

910
describe('calc', () => {
1011
it('adds simple dependency', () => {
@@ -254,4 +255,46 @@ describe('calc', () => {
254255

255256
expect(handler).not.toHaveBeenCalled();
256257
});
258+
259+
it('allows to use promises via promiseCalc', async (done) => {
260+
const obj = {
261+
a: 1,
262+
b: 2
263+
};
264+
265+
calc(obj, 'c', ['a', 'b'], (a, b) => new Promise(resolve => setTimeout(() => resolve(a + b), 10)), {
266+
promiseCalc: true
267+
});
268+
269+
expect(obj.c).toEqual(undefined);
270+
obj.a = 3;
271+
await delay(50);
272+
expect(obj.c).toEqual(5);
273+
obj.b = 3;
274+
await delay(50);
275+
expect(obj.c).toEqual(6);
276+
277+
done();
278+
});
279+
280+
it('allows to use non-promises when promiseCalc=true', async (done) => {
281+
const obj = {
282+
a: 1,
283+
b: 2
284+
};
285+
286+
calc(obj, 'c', ['a', 'b'], (a, b) => a + b, {
287+
promiseCalc: true
288+
});
289+
290+
expect(obj.c).toEqual(undefined);
291+
obj.a = 3;
292+
await delay(50);
293+
expect(obj.c).toEqual(5);
294+
obj.b = 3;
295+
await delay(50);
296+
expect(obj.c).toEqual(6);
297+
298+
done();
299+
});
257300
});

yarn.lock

+22
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,16 @@ babel-helper-optimise-call-expression@^6.24.1:
422422
babel-runtime "^6.22.0"
423423
babel-types "^6.24.1"
424424

425+
babel-helper-remap-async-to-generator@^6.24.1:
426+
version "6.24.1"
427+
resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
428+
dependencies:
429+
babel-helper-function-name "^6.24.1"
430+
babel-runtime "^6.22.0"
431+
babel-template "^6.24.1"
432+
babel-traverse "^6.24.1"
433+
babel-types "^6.24.1"
434+
425435
babel-helper-replace-supers@^6.24.1:
426436
version "6.24.1"
427437
resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
@@ -531,10 +541,22 @@ [email protected]:
531541
babel-template "^6.3.13"
532542
better-log "^1.3.1"
533543

544+
babel-plugin-syntax-async-functions@^6.8.0:
545+
version "6.13.0"
546+
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
547+
534548
babel-plugin-syntax-object-rest-spread@^6.8.0:
535549
version "6.13.0"
536550
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
537551

552+
babel-plugin-transform-async-to-generator@^6.24.1:
553+
version "6.24.1"
554+
resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
555+
dependencies:
556+
babel-helper-remap-async-to-generator "^6.24.1"
557+
babel-plugin-syntax-async-functions "^6.8.0"
558+
babel-runtime "^6.22.0"
559+
538560
babel-plugin-transform-es2015-arrow-functions@^6.22.0:
539561
version "6.22.0"
540562
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"

0 commit comments

Comments
 (0)