mirror of
https://github.com/esiur/esiur-js.git
synced 2025-05-06 04:22:58 +00:00
41 lines
1.6 KiB
JavaScript
41 lines
1.6 KiB
JavaScript
import Warehouse from "../Resource/Warehouse.js";
|
|
|
|
export default class ResourceProxy {
|
|
static cache = {};
|
|
|
|
static getProxy(type) {
|
|
let template = Warehouse.getTemplateByType(type);
|
|
let className = type.prototype.constructor.name;
|
|
let classUrl = "esiur://" + template.className.replace('.', '/');
|
|
|
|
if (template.namespace != null) {
|
|
className = template.namespace + "_" + className;
|
|
}
|
|
|
|
if (ResourceProxy.cache[className])
|
|
return ResourceProxy.cache[className];
|
|
|
|
var code = `return ( class E_${className} extends b { constructor() {super();} `;
|
|
|
|
// generate class
|
|
for (var i = 0; i < template.properties.length; i++) {
|
|
let pt = template.properties[i];
|
|
let desc = Object.getOwnPropertyDescriptor(type.prototype, pt.name);
|
|
if (desc) {
|
|
code += `\r\n set ${pt.name}(v) { \r\n super.${pt.name} = v; \r\n if (this.instance) this.instance.emitModification(this.instance.template.properties[${i}], v); } \r\n get ${pt.name}() { \r\n return super.${pt.name};}`;
|
|
}
|
|
else {
|
|
code += `\r\n set ${pt.name}(v) { \r\n super._${pt.name} = v; \r\n if (this.instance) this.instance.emitModification(this.instance.template.properties[${i}], v); } \r\n get ${pt.name}() { \r\n return this._${pt.name};}`;
|
|
}
|
|
}
|
|
|
|
var func = new Function("b", `//# sourceURL=${classUrl} \r\n ${code}});`);
|
|
|
|
var proxyType = func.call(type /* this */, type);
|
|
|
|
ResourceProxy.cache[className] = proxyType;
|
|
|
|
return proxyType;
|
|
|
|
}
|
|
} |