##// END OF EJS Templates
Changed @djclass decorator to support legacy dojo versions (<1.15)
Changed @djclass decorator to support legacy dojo versions (<1.15)

File last commit:

r11:5a2c44d8e1f3 v1.0.0-rc5 default
r11:5a2c44d8e1f3 v1.0.0-rc5 default
Show More
declare.ts
240 lines | 8.8 KiB | video/mp2t | TypeScriptLexer
cin
Initial commit, copied files related to .tsx scripts support.
r0 import declare = require("dojo/_base/declare");
import { each } from "@implab/core-amd/safe";
import { Constructor } from "@implab/core-amd/interfaces";
cin
switched back to dojo-typings module...
r4 // import { DeclareConstructor } from "dojo/_base/declare";
type DeclareConstructor<T> = dojo._base.DeclareConstructor<T>;
cin
Initial commit, copied files related to .tsx scripts support.
r0
export interface AbstractConstructor<T = {}> {
prototype: T;
}
interface DjMockConstructor<T = {}> {
new(...args: any[]): T;
mock: boolean;
base: AbstractConstructor;
}
export function djbase<T>(
b0: AbstractConstructor<T>
cin
created typings for basic part of dojo and dijit further work is required to...
r2 ): DeclareConstructor<T>;
cin
Initial commit, copied files related to .tsx scripts support.
r0
export function djbase<T0, T1>(
b0: AbstractConstructor<T0>,
b1: AbstractConstructor<T1>
cin
created typings for basic part of dojo and dijit further work is required to...
r2 ): DeclareConstructor<T0 & T1>;
cin
Initial commit, copied files related to .tsx scripts support.
r0
export function djbase<T0, T1, T2>(
b0: AbstractConstructor<T0>,
b1: AbstractConstructor<T1>,
b2: AbstractConstructor<T2>
cin
created typings for basic part of dojo and dijit further work is required to...
r2 ): DeclareConstructor<T0 & T1 & T2>;
cin
Initial commit, copied files related to .tsx scripts support.
r0
export function djbase<T0, T1, T2, T3>(
b0: AbstractConstructor<T0>,
b1: AbstractConstructor<T1>,
b2: AbstractConstructor<T2>,
b3: AbstractConstructor<T3>
cin
created typings for basic part of dojo and dijit further work is required to...
r2 ): DeclareConstructor<T0 & T1 & T2 & T3>;
cin
Initial commit, copied files related to .tsx scripts support.
r0
export function djbase<T0, T1, T2, T3, T4>(
b0: AbstractConstructor<T0>,
b1: AbstractConstructor<T1>,
b2: AbstractConstructor<T2>,
b3: AbstractConstructor<T3>,
b4: AbstractConstructor<T4>
cin
created typings for basic part of dojo and dijit further work is required to...
r2 ): DeclareConstructor<T0 & T1 & T2 & T3 & T4>;
cin
Initial commit, copied files related to .tsx scripts support.
r0
export function djbase<T0, T1, T2, T3, T4, T5>(
b0: AbstractConstructor<T0>,
b1: AbstractConstructor<T1>,
b2: AbstractConstructor<T2>,
b3: AbstractConstructor<T3>,
b4: AbstractConstructor<T4>,
b5: AbstractConstructor<T5>
cin
created typings for basic part of dojo and dijit further work is required to...
r2 ): DeclareConstructor<T0 & T1 & T2 & T3 & T4 & T5>;
cin
Initial commit, copied files related to .tsx scripts support.
r0
export function djbase<T0, T1, T2, T3, T4, T5, T6>(
b0: AbstractConstructor<T0>,
b1: AbstractConstructor<T1>,
b2: AbstractConstructor<T2>,
b3: AbstractConstructor<T3>,
b4: AbstractConstructor<T4>,
b5: AbstractConstructor<T5>,
b6: AbstractConstructor<T6>
cin
created typings for basic part of dojo and dijit further work is required to...
r2 ): DeclareConstructor<T0 & T1 & T2 & T3 & T4 & T5 & T6>;
cin
Initial commit, copied files related to .tsx scripts support.
r0
export function djbase<T0, T1, T2, T3, T4, T5, T6, T7>(
b0: AbstractConstructor<T0>,
b1: AbstractConstructor<T1>,
b2: AbstractConstructor<T2>,
b3: AbstractConstructor<T3>,
b4: AbstractConstructor<T4>,
b5: AbstractConstructor<T5>,
b6: AbstractConstructor<T6>,
b7: AbstractConstructor<T7>
cin
created typings for basic part of dojo and dijit further work is required to...
r2 ): DeclareConstructor<T0 & T1 & T2 & T3 & T4 & T5 & T6 & T7>;
cin
Initial commit, copied files related to .tsx scripts support.
r0
/** Создает конструктор-заглушку из списка базовых классов, используется
* для объявления классов при помощи `dojo/_base/declare`.
*
* Создает пустой конструтор, с пустым стандартным прототипом, это нужно,
* поскольку в унаследованном классе конструктор обязательно должен вызвать
* `super(...)`, таким образом он вызовет пустую функцию.
*
* Созданный конструтор хранит в себе список базовых классов, который будет
* использован декоратором `djclass`, который вернет класс, объявленный при
* помощи `dojo/_base/declare`.
*
* @param bases список базовых классов, от которых требуется унаследовать
* новый класс.
*
*/
export function djbase(...bases: any[]): Constructor {
const t = class {
static mock: boolean;
static base: AbstractConstructor;
};
t.mock = true;
t.base = declare(bases);
return t as any;
}
function isMockConstructor<T extends {}>(v: AbstractConstructor<T>): v is DjMockConstructor<T> {
return v && "mock" in v;
}
/** Создает класс при помощи `dojo/_base/declare`. Для этого исходный класс
* должен быть унаследован от `djbase(...)`.
*
* @param target Класс, который нужно объявить при помощи `dojo/_base/declare`
*/
export function djclass<T extends AbstractConstructor>(target: T): T {
// получаем базовый конструктор и его прототип
let bp = target && target.prototype && Object.getPrototypeOf(target.prototype);
const bc = bp && bp.constructor;
// проверка того, что класс унаследован от специальной заглушки
if (isMockConstructor(bc)) {
// t - базовый класс, объявленный при помощи dojo/_base/declare
const t = bc.base;
// bc - базовый класс, bc.prototype используется как super
// при вызове базовых методов. Нужно создать bc.prototype
// таким образом, чтобы он вызывал this.inherited().
// создаем новый порототип, он не в цепочке прототипов у текущего
// класса, но super.some_method будет использовать именно его.
// в этом объекте будут размещены прокси для переопределенных
// методов.
bp = bc.prototype = Object.create(t.prototype);
bp.constructor = bc;
// proxy - фабрика для создания прокси-методов, которые внутри
// себя вызовут this.inherited с правильными параметрами.
cin
typescript strict mode...
r1 const proxy = (m: (...args: any[]) => any) => function (this: any) {
cin
Changed @djclass decorator to support legacy dojo versions (<1.15)
r11 const f = this.getInherited({ callee: m });
return f && f.apply(this, arguments);
// так сделать можно только dojo 1.15+
// return this.inherited(m, arguments);
cin
Initial commit, copied files related to .tsx scripts support.
r0 };
// у текущего класса прототип содержит методы, объявленные в этом
// классе и его конструктор. Нужно пройти по всем методам и
// создать для них прокси.
// При этом только те, методы, которые есть в базовых классах
// могут быть переопределены.
each(target.prototype, (m: any, p: string | number | symbol) => {
if (typeof m === "function" &&
p !== "constructor" &&
target.prototype.hasOwnProperty(p) &&
p in t.prototype
) {
bp[p] = proxy(m);
}
});
const cls = declare(t, target.prototype);
// TODO mixin static members
return cls as any;
} else {
return target as any;
}
}
function makeSetterName(prop: string) {
return [
"_set",
prop.replace(/^./, x => x.toUpperCase()),
"Attr"
].join("");
}
function makeGetterName(prop: string) {
return [
"_get",
prop.replace(/^./, x => x.toUpperCase()),
"Attr"
].join("");
}
interface NodeBindSpec {
node: string;
type: string;
}
/**
* Описание привязки свойства виджета к свойству внутреннего объекта.
*/
interface MemberBindSpec {
/**
* Имя свойства со ссылкой на объект, к которому .
*/
member: string;
/**
* Свойство объекта к которому нужно осуществить привязку.
*/
property: string;
/**
* Привязка осуществляется не только на запись но и на чтение свойства.
*/
getter?: boolean;
}
cin
typescript strict mode...
r1 function isNodeBindSpec(v: any): v is NodeBindSpec {
cin
Initial commit, copied files related to .tsx scripts support.
r0 return "node" in v;
}
cin
typescript strict mode...
r1 function isMemberBindSpec(v: any): v is MemberBindSpec {
cin
Initial commit, copied files related to .tsx scripts support.
r0 return "member" in v;
}
/** Декорирует свойства виджета для привязки их к внутренним членам, либо DOM
* элементам, либо свойству внутреннего объекта.
*
* @param {NodeBindSpec | MemberBindSpec} params Параметры связывания.
*/
export function bind(params: NodeBindSpec | MemberBindSpec) {
if (isNodeBindSpec(params))
return (target: any, name: string) => {
target[makeSetterName(name)] = params;
};
else if (isMemberBindSpec(params)) {
return (target: any, name: string) => {
target[name] = null;
cin
typescript strict mode...
r1 target[makeSetterName(name)] = function (v: any) {
cin
Initial commit, copied files related to .tsx scripts support.
r0 this._set(name, v);
this[params.member].set(params.property, v);
};
if (params.getter)
target[makeGetterName(name)] = function () {
return this[params.member].get(params.property);
};
};
}
}