@kospa/base
Version:
Base components for kospa framework
125 lines (124 loc) • 4.46 kB
JavaScript
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "knockout", "./loader", "./system"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createActivateObservable = exports.call = exports.deactivate = exports.activate = exports.constructs = void 0;
var ko = require("knockout");
var loader = require("./loader");
var system = require("./system");
function constructs(VmModule) {
return isConstructor(VmModule) ? new VmModule() : VmModule;
}
exports.constructs = constructs;
function activate(VmModule, args) {
var vm = constructs(VmModule);
if (!vm || vm.activated) {
return Promise.resolve(vm);
}
return call.apply(void 0, __spreadArrays([vm, "activate"], (args || []))).then(function () {
vm.activated = true;
return vm;
});
}
exports.activate = activate;
function deactivate(vm, newVm) {
if (!vm || !vm.activated) {
return Promise.resolve(vm);
}
return call(vm, "deactivate", newVm !== vm)
.then(function () {
vm.activated = false;
return vm;
});
}
exports.deactivate = deactivate;
function call(vm, key) {
var args = [];
for (var _i = 2; _i < arguments.length; _i++) {
args[_i - 2] = arguments[_i];
}
try {
if (typeof vm[key] !== "function") {
return Promise.resolve(null);
}
return Promise.resolve(vm[key].apply(vm, args));
}
catch (err) {
return Promise.reject(err);
}
}
exports.call = call;
function createActivateObservable(target, config) {
var opts = ensureArgs(target, config);
var prom = Promise.resolve(null);
var result = system.extend(ko.computed({
read: opts.target,
write: function (val) {
var old = opts.target(), args = getArgs(result.args);
prom = loadModule(val)
.then(function (vm) {
return deactivate(old, vm)
.then(function () { return activate(vm, args); });
})
.then(function (vm) {
opts.target(vm);
return vm;
})
.catch(function (err) {
if (typeof result.onError !== "function") {
throw err;
}
return result.onError(err);
});
}
}), {
then: function (onSuccess, onError) { return prom.then(onSuccess, onError); },
catch: function (onError) { return prom.catch(onError); },
args: opts.config.args || [],
onError: opts.config.onError || (function (err) {
system.error("activator>", err);
throw err;
})
});
return result;
}
exports.createActivateObservable = createActivateObservable;
ko.extenders["activate"] = function (target, config) {
return createActivateObservable(target, config);
};
function loadModule(mod) {
return typeof mod === "string" ?
loader.loadModule(mod) :
Promise.resolve(mod);
}
function getArgs(args) {
return typeof args === "function" ? args() : args;
}
function ensureArgs(target, config) {
if (!config && !ko.isWriteableObservable(target)) {
config = target;
target = undefined;
}
return {
target: target || ko.observable(),
config: config || {}
};
}
function isConstructor(obj) {
return typeof obj === "function";
}
});