@rxx/worker
Version:
React MVI micro framework.
257 lines • 18.5 kB
JavaScript
"use strict";
/**
* The MIT License (MIT)
* Copyright (c) Taketoshi Aono
*
* 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.
* @fileoverview
* @author Taketoshi Aono
*/
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var intent_1 = require("../intent/intent");
var store_1 = require("../store/store");
var operators_1 = require("rxjs/operators");
var factory_1 = require("../factory");
var worker_1 = require("../worker");
var power_assert_1 = tslib_1.__importDefault(require("power-assert"));
var assert_1 = tslib_1.__importDefault(require("assert"));
var Intent = /** @class */ (function () {
function Intent() {
}
Intent.prototype.test = function () {
return this.intent.for('test').pipe(operators_1.share());
};
Intent = tslib_1.__decorate([
intent_1.intent
], Intent);
return Intent;
}());
var TestStore = /** @class */ (function () {
function TestStore() {
}
TestStore.prototype.initialize = function () {
return {
view: {
base: this.intent.test().pipe(operators_1.scan(function (acc, next) { return acc + 1; }, 1), operators_1.share(), operators_1.startWith(1)),
test: this.intent.test().pipe(operators_1.scan(function (acc, next) { return acc + 1; }, 1), operators_1.share(), operators_1.startWith(1)),
test2: this.subject.pipe(operators_1.map(function (_a) {
var type = _a.type, payload = _a.payload, states = _a.states;
switch (type) {
case 'subject-test':
return payload + states.test2;
default:
return payload;
}
}), operators_1.startWith(1)),
},
};
};
TestStore = tslib_1.__decorate([
store_1.store
], TestStore);
return TestStore;
}());
function testStore(observable, initialState) {
return {
view: observable.pipe(operators_1.scan(function (acc, args) {
switch (args.type) {
case 'test':
return acc + 1;
default:
return acc;
}
}, initialState), operators_1.startWith(initialState)),
};
}
var TestStore2 = /** @class */ (function () {
function TestStore2() {
}
TestStore2.prototype.initialize = function () {
return {
view: {
test3: this.intent.test().pipe(operators_1.scan(function (acc, next) { return next.data; }, 1), operators_1.share(), operators_1.startWith(0)),
},
};
};
TestStore2 = tslib_1.__decorate([
store_1.store
], TestStore2);
return TestStore2;
}());
var TestStore3 = /** @class */ (function () {
function TestStore3() {
}
TestStore3.prototype.initialize = function () {
return {
view: {
test: this.intent.test().pipe(operators_1.scan(function (acc, next) { return acc + 1; }, this.foo), operators_1.share(), operators_1.startWith(this.foo)),
},
};
};
TestStore3 = tslib_1.__decorate([
store_1.store
], TestStore3);
return TestStore3;
}());
var Intent4 = /** @class */ (function () {
function Intent4() {
}
Intent4.prototype.test = function () {
return this.intent.for('on-click').pipe(operators_1.share());
};
Intent4 = tslib_1.__decorate([
intent_1.intent
], Intent4);
return Intent4;
}());
var TestStore4 = /** @class */ (function () {
function TestStore4() {
}
TestStore4.prototype.initialize = function () {
return {
view: {
test3: this.intent.test().pipe(operators_1.map(function (_a) {
var state = _a.state;
return state.view.base + 1;
}), operators_1.startWith(0)),
},
};
};
TestStore4 = tslib_1.__decorate([
store_1.store
], TestStore4);
return TestStore4;
}());
var WAIT_TIME_MS = 200;
describe('factory.tsx', function () {
var dispatched = [];
beforeAll(function () {
global['RECEIVE_WORKER_MESSAGE'] = function (_a) {
var type = _a.type, payload = _a.payload;
dispatched.push({ type: type, payload: payload });
};
});
afterEach(function () {
dispatched.length = 0;
});
describe('makeView/makeApp', function () {
it('should pass intent and store to children.', function (done) {
var subject = factory_1.run({}, {}, {
store: TestStore,
intent: Intent,
});
subject.next({ type: 'INITIALIZE', payload: {} });
subject.next({
type: 'DISPATCH',
payload: { type: 'test', payload: 1 },
});
setTimeout(function () {
power_assert_1.default.strictEqual(dispatched.length, 3);
assert_1.default.deepStrictEqual(dispatched[0], {
type: worker_1.WorkerPostEventType.INITIALIZED,
payload: {
base: 1,
test: 1,
test2: 1,
},
});
assert_1.default.deepStrictEqual(dispatched[1], {
type: worker_1.WorkerPostEventType.UPDATE,
payload: {
base: 2,
test: 2,
test2: 1,
},
});
assert_1.default.deepStrictEqual(dispatched[2], {
type: worker_1.WorkerPostEventType.DISPATCHED,
payload: { type: 'test', payload: 1 },
});
done();
}, WAIT_TIME_MS);
});
it('should pass intent and store group to children.', function (done) {
var subject = factory_1.run({}, {}, {
store: [TestStore, TestStore2],
intent: Intent,
});
setTimeout(function () {
subject.next({ type: 'INITIALIZE', payload: {} });
subject.next({
type: 'DISPATCH',
payload: { type: 'test', payload: 1 },
});
setTimeout(function () {
power_assert_1.default.strictEqual(dispatched.length, 3);
assert_1.default.deepStrictEqual(dispatched[0], {
type: worker_1.WorkerPostEventType.INITIALIZED,
payload: {
base: 1,
test: 1,
test2: 1,
test3: 0,
},
});
assert_1.default.deepStrictEqual(dispatched[1], {
type: worker_1.WorkerPostEventType.UPDATE,
payload: {
base: 2,
test: 2,
test2: 1,
test3: 1,
},
});
assert_1.default.deepStrictEqual(dispatched[2], {
type: worker_1.WorkerPostEventType.DISPATCHED,
payload: { type: 'test', payload: 1 },
});
done();
}, WAIT_TIME_MS);
});
});
it('should pass services', function (done) {
var subject = factory_1.run({}, {}, {
store: TestStore3,
intent: Intent,
service: { foo: 10 },
});
subject.next({ type: 'INITIALIZE', payload: {} });
subject.next({
type: 'DISPATCH',
payload: { type: 'test', payload: 1 },
});
setTimeout(function () {
power_assert_1.default.strictEqual(dispatched.length, 3);
assert_1.default.deepStrictEqual(dispatched[0], {
type: worker_1.WorkerPostEventType.INITIALIZED,
payload: {
test: 10,
},
});
assert_1.default.deepStrictEqual(dispatched[1], {
type: worker_1.WorkerPostEventType.UPDATE,
payload: {
test: 11,
},
});
assert_1.default.deepStrictEqual(dispatched[2], {
type: worker_1.WorkerPostEventType.DISPATCHED,
payload: { type: 'test', payload: 1 },
});
done();
}, WAIT_TIME_MS);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL19fdGVzdHNfXy9mYWN0b3J5LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRzs7O0FBSUgsMkNBQTBDO0FBQzFDLHdDQUE4QztBQUc5Qyw0Q0FBcUU7QUFDckUsc0NBQTBDO0FBRTFDLG9DQUErRDtBQUMvRCxzRUFBa0M7QUFDbEMsMERBQWdDO0FBR2hDO0lBQUE7SUFNQSxDQUFDO0lBSFEscUJBQUksR0FBWDtRQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFMRyxNQUFNO1FBRFgsZUFBTTtPQUNELE1BQU0sQ0FNWDtJQUFELGFBQUM7Q0FBQSxBQU5ELElBTUM7QUFHRDtJQUFBO0lBa0NBLENBQUM7SUEzQlEsOEJBQVUsR0FBakI7UUFDRSxPQUFPO1lBQ0wsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FDM0IsZ0JBQUksQ0FBQyxVQUFDLEdBQUcsRUFBRSxJQUFTLElBQUssT0FBQSxHQUFHLEdBQUcsQ0FBQyxFQUFQLENBQU8sRUFBRSxDQUFDLENBQUMsRUFDcEMsaUJBQUssRUFBRSxFQUNQLHFCQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2I7Z0JBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUMzQixnQkFBSSxDQUFDLFVBQUMsR0FBRyxFQUFFLElBQVMsSUFBSyxPQUFBLEdBQUcsR0FBRyxDQUFDLEVBQVAsQ0FBTyxFQUFFLENBQUMsQ0FBQyxFQUNwQyxpQkFBSyxFQUFFLEVBQ1AscUJBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDYjtnQkFDRCxLQUFL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