@ribajs/core
Version:
Core module of Riba.js
246 lines • 19.9 kB
JavaScript
import { parseType, PRIMITIVE, KEYPATH } from "@ribajs/utils";
import { Observer } from "./observer.js";
import { FORMATTER_ARGS, FORMATTER_SPLIT } from "./constants/formatter.js";
import { getInputValue } from "@ribajs/utils/src/dom.js";
export class Binder {
static key = "";
static block = false;
name;
publishes = false;
priority = 0;
value;
observer;
view;
el;
type;
formatters;
formatterObservers = {};
keypath;
args;
model;
marker;
constructor(view, el, type, name, keypath, formatters, identifier) {
this.view = view;
this.el = el;
this.type = type;
this.name = name;
this.keypath = keypath;
this.formatters = formatters;
this.model = undefined;
if (identifier && type) {
this.args = this.getStarArguments(identifier, type);
}
else {
this.args = new Array();
}
}
observe(model, keypath, callback) {
return new Observer(model, keypath, callback);
}
parseTarget() {
if (this.keypath) {
const token = parseType(this.keypath, true);
if (token.type === PRIMITIVE) {
this.value = token.value;
}
else if (token.type === KEYPATH) {
this.observer = this.observe(this.view.models, this.keypath, this);
this.model = this.observer.target;
}
else {
throw new Error(`[${this.name}] Unknown type in token`);
}
}
else {
this.value = undefined;
}
}
getIterationAlias(modelName) {
return "%" + modelName + "%";
}
parseFormatterArguments(args, formatterIndex) {
return args
.map((arg) => parseType(arg, true))
.map(({ type, value }, ai) => {
if (type === PRIMITIVE) {
const primitiveValue = value;
return primitiveValue;
}
else if (type === KEYPATH) {
const keypath = value;
if (!this.formatterObservers[formatterIndex]) {
this.formatterObservers[formatterIndex] = {};
}
let observer = this.formatterObservers[formatterIndex][ai];
if (!observer) {
observer = this.observe(this.view.models, keypath, this);
this.formatterObservers[formatterIndex][ai] = observer;
}
return observer.value();
}
else {
throw new Error(`[${this.name}] Unknown argument type`);
}
});
}
formattedValue(value, startIndex = 0) {
if (this.formatters === null) {
throw new Error(`[${this.name} formatters is null`);
}
let promised = false;
const formatters = startIndex
? this.formatters.slice(startIndex)
: this.formatters;
return formatters.reduce((result, declaration, index) => {
if (promised) {
return result;
}
const args = declaration.match(FORMATTER_ARGS);
if (args === null) {
console.warn(new Error(`[${this.name}] No args matched with regex "FORMATTER_ARGS"!\nvalue: ${JSON.stringify(value)}\nresult: ${JSON.stringify(result)}\ndeclaration: ${JSON.stringify(declaration)}\nindex: ${index}\n`));
return result;
}
const id = args.shift();
if (!id) {
throw new Error(`[${this.name}] No formatter id found in args!`);
}
if (!this.view.options.formatters) {
throw new Error(`[${this.name}] No formatters are defined!`);
}
const formatter = this.view.options.formatters[id];
if (!formatter) {
const error = new Error(`[${this.name}] No formatters with id "${id}" found!`);
console.error(error, "html element: ", this.el);
throw error;
}
const processedArgs = this.parseFormatterArguments(args, index);
if (formatter && typeof formatter.read === "function") {
result = formatter.read.apply(this.model, [result, ...processedArgs]);
}
if (index < formatters.length - 1 &&
result &&
typeof result.then === "function" &&
typeof result.catch === "function") {
promised = true;
return result.then((value) => this.formattedValue(value, index + 1));
}
return result;
}, value);
}
eventHandler(fn, el) {
const handler = this.view.options.handler;
return (ev) => {
if (!handler) {
throw new Error("No handler defined in binding.view.options.handler");
}
handler.call(fn, this, ev, this, el);
};
}
set(value) {
try {
value = this.formattedValue(value);
}
catch (error) {
console.error(error);
return value;
}
if (typeof this.routine === "function") {
if (value &&
typeof value.then === "function" &&
typeof value.catch === "function") {
value
.then((realValue) => {
this.routine(this.el, realValue);
})
.catch((error) => {
console.error(error);
});
}
else {
this.routine(this.el, value);
}
}
}
sync() {
if (this.observer) {
this.model = this.observer.target;
this.set(this.observer.value());
}
else {
this.set(this.value);
}
}
publish() {
if (this.observer) {
if (this.formatters === null) {
throw new Error("formatters is null");
}
const value = this.formatters.reduceRight((result, declaration, index) => {
const args = declaration.split(FORMATTER_SPLIT);
const id = args.shift();
if (!id) {
throw new Error("id not defined");
}
if (!this.view.options.formatters) {
return undefined;
}
const formatter = this.view.options.formatters[id];
const processedArgs = this.parseFormatterArguments(args, index);
if (formatter && typeof formatter.publish === "function") {
result = formatter.publish(result, ...processedArgs);
}
return result;
}, this._getValue(this.el));
this.observer.setValue(value);
}
}
_bind() {
this.parseTarget();
if (this.bind) {
if (typeof this.bind !== "function") {
throw new Error("the method bind is not a function");
}
this.bind(this.el);
}
if (this.view.options.preloadData) {
this.sync();
}
}
_unbind() {
if (this.unbind) {
this.unbind(this.el);
}
if (this.observer) {
this.observer.unobserve();
}
Object.keys(this.formatterObservers).forEach((fi) => {
const args = this.formatterObservers[fi];
Object.keys(args).forEach((ai) => {
args[ai].unobserve();
});
});
this.formatterObservers = {};
}
_update(models = {}) {
if (this.observer) {
this.model = this.observer.target;
}
if (typeof this.update === "function") {
this.update(models);
}
}
_getValue(el) {
if (typeof this.getValue === "function") {
return this.getValue(el);
}
else {
return getInputValue(el);
}
}
getStarArguments(identifier, type) {
const regexp = this.view.binderRegex(identifier);
const match = type.match(regexp)?.slice(1) || [];
return match;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JpbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU96QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUt6RCxNQUFNLE9BQWdCLE1BQU07SUFNMUIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFLaEIsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFLckIsSUFBSSxDQUFTO0lBS2IsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUlsQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBNEJOLEtBQUssQ0FBTztJQUNaLFFBQVEsQ0FBWTtJQUNwQixJQUFJLENBQU87SUFDWCxFQUFFLENBQUk7SUFLTixJQUFJLENBQWdCO0lBQ3BCLFVBQVUsQ0FBa0I7SUFDNUIsa0JBQWtCLEdBQXVCLEVBQUUsQ0FBQztJQUM1QyxPQUFPLENBQVU7SUFLakIsSUFBSSxDQUF5QjtJQUs3QixLQUFLLENBQU87SUFLWixNQUFNLENBQVc7SUFjeEIsWUFDRSxJQUFVLEVBQ1YsRUFBSyxFQUNMLElBQW1CLEVBQ25CLElBQVksRUFDWixPQUEyQixFQUMzQixVQUEyQixFQUMzQixVQUF5QjtRQUV6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdB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