TeaWeb/shared/js/proto.ts

447 lines
14 KiB
TypeScript
Raw Normal View History

/* setup jsrenderer */
import "jsrender";
import { tr } from "./i18n/localize";
import { LogCategory, logError, logTrace } from "tc-shared/log";
(window as any).$ = require("jquery");
(window as any).jQuery = $;
2020-07-21 10:59:02 +00:00
require("jsrender")($);
2020-03-30 11:44:18 +00:00
declare global {
2020-07-19 14:34:08 +00:00
function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
2020-03-30 11:44:18 +00:00
interface Array<T> {
remove(elem?: T): boolean;
last?(): T;
2018-02-27 16:20:49 +00:00
2020-03-30 11:44:18 +00:00
pop_front(): T | undefined;
2021-03-12 16:46:27 +00:00
/**
* @param entry The entry to toggle
* @returns `true` if the entry has been inserted and false if the entry has been deleted
*/
toggle(entry: T): boolean;
2021-03-12 16:46:27 +00:00
/**
* @param entry The entry to toggle
* @param insert Whatever the entry should be in the array or not
* @returns `true` if the array has been modified
*/
toggle(entry: T, insert: boolean);
2020-03-30 11:44:18 +00:00
}
2018-02-27 16:20:49 +00:00
2020-03-30 11:44:18 +00:00
interface JSON {
map_to<T>(object: T, json: any, variables?: string | string[], validator?: (map_field: string, map_value: string) => boolean, variable_direction?: number): number;
map_field_to<T>(object: T, value: any, field: string): boolean;
2020-03-30 11:44:18 +00:00
}
2018-08-10 19:30:58 +00:00
2020-03-30 11:44:18 +00:00
type JQueryScrollType = "height" | "width";
interface JQuery<TElement = HTMLElement> {
renderTag(values?: any): JQuery<TElement>;
hasScrollBar(direction?: JQueryScrollType): boolean;
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 15:08:10 +00:00
visible_height(): number;
visible_width(): number;
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 15:08:10 +00:00
2020-03-30 11:44:18 +00:00
/* first element which matches the selector, could be the element itself or a parent */
firstParent(selector: string): JQuery;
2020-03-30 11:44:18 +00:00
}
2018-02-27 16:20:49 +00:00
2020-03-30 11:44:18 +00:00
interface JQueryStatic<TElement extends Node = HTMLElement> {
spawn<K extends keyof HTMLElementTagNameMap>(tagName: K): JQuery<HTMLElementTagNameMap[K]>;
}
interface Window {
__REACT_DEVTOOLS_GLOBAL_HOOK__: any;
2020-04-01 13:40:45 +00:00
readonly webkitAudioContext: typeof AudioContext;
readonly AudioContext: typeof OfflineAudioContext;
2020-03-30 11:44:18 +00:00
readonly OfflineAudioContext: typeof OfflineAudioContext;
readonly webkitOfflineAudioContext: typeof OfflineAudioContext;
2020-03-30 11:44:18 +00:00
readonly RTCPeerConnection: typeof RTCPeerConnection;
readonly Pointer_stringify: any;
2020-04-11 09:43:41 +00:00
readonly require: typeof require;
2020-03-30 11:44:18 +00:00
}
2020-04-11 09:43:41 +00:00
const __non_webpack_require__: typeof require;
2020-03-30 11:44:18 +00:00
interface Navigator {
browserSpecs: {
name: string,
version: string
};
}
interface ObjectConstructor {
isSimilar(a: any, b: any): boolean;
}
}
export type IfEquals<X, Y, A = X, B = never> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? A : B;
export type WritableKeys<T> = {
[P in keyof T]-?: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, P, never>
}[keyof T];
export type ReadonlyKeys<T> = {
[P in keyof T]: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, never, P>
}[keyof T];
if (!Object.isSimilar) {
Object.isSimilar = function (a, b) {
const aType = typeof a;
const bType = typeof b;
if (aType !== bType) {
return false;
}
if (aType === "object") {
const aKeys = Object.keys(a);
const bKeys = Object.keys(b);
if (aKeys.length != bKeys.length) { return false; }
if (aKeys.findIndex(key => bKeys.indexOf(key) !== -1) !== -1) { return false; }
return aKeys.findIndex(key => !Object.isSimilar(a[key], b[key])) === -1;
} else {
return a === b;
}
};
2018-02-27 16:20:49 +00:00
}
if (!JSON.map_to) {
2019-09-12 21:59:35 +00:00
JSON.map_to = function <T>(object: T, json: any, variables?: string | string[], validator?: (map_field: string, map_value: string) => boolean, variable_direction?: number): number {
2020-07-19 16:49:00 +00:00
if (!validator)
validator = () => true;
2018-08-10 19:30:58 +00:00
2018-09-30 19:50:59 +00:00
if (!variables) {
2018-08-10 19:30:58 +00:00
variables = [];
2018-09-30 19:50:59 +00:00
if (!variable_direction || variable_direction == 0) {
2020-07-19 16:49:00 +00:00
for (let field of Object.keys(json))
2018-08-10 19:30:58 +00:00
variables.push(field);
2018-09-30 19:50:59 +00:00
} else if (variable_direction == 1) {
2020-07-19 16:49:00 +00:00
for (let field of Object.keys(json))
2018-08-10 19:30:58 +00:00
variables.push(field);
}
2018-09-30 19:50:59 +00:00
} else if (!Array.isArray(variables)) {
2018-08-10 19:30:58 +00:00
variables = [variables];
}
2019-09-12 21:59:35 +00:00
let updates = 0;
2018-09-30 19:50:59 +00:00
for (let field of variables) {
2020-02-02 14:05:36 +00:00
if (typeof json[field] === "undefined") {
logTrace(LogCategory.GENERAL, tr("Json does not contains %s"), field);
2018-08-10 19:30:58 +00:00
continue;
}
2018-09-30 19:50:59 +00:00
if (!validator(field, json[field])) {
logTrace(LogCategory.GENERAL, tr("Validator results in false for %s"), field);
2018-08-10 19:30:58 +00:00
continue;
}
if (JSON.map_field_to(object, json[field], field))
2019-09-12 21:59:35 +00:00
updates++;
2018-08-10 19:30:58 +00:00
}
2019-09-12 21:59:35 +00:00
return updates;
2018-08-10 19:30:58 +00:00
}
}
if (!JSON.map_field_to) {
JSON.map_field_to = function <T>(object: T, value: any, field: string): boolean {
let fieldType = typeof object[field];
let newValue;
if (fieldType == "string" || fieldType == "object" || fieldType == "undefined") {
newValue = value;
} else if (fieldType == "number") {
newValue = parseFloat(value);
} else if (fieldType == "boolean") {
newValue = typeof value === "boolean" && value || value === "1" || value === "true";
} else {
console.warn(tr("Invalid object type %s for entry %s"), fieldType, field);
2019-09-12 21:59:35 +00:00
return false;
}
if (newValue === object[field]) {
return false;
}
2018-08-10 19:30:58 +00:00
object[field] = newValue;
2019-09-12 21:59:35 +00:00
return true;
2018-08-10 19:30:58 +00:00
}
}
2018-02-27 16:20:49 +00:00
if (!Array.prototype.remove) {
Array.prototype.remove = function <T>(elem?: T): boolean {
const index = this.indexOf(elem);
2018-02-27 16:20:49 +00:00
if (index > -1) {
this.splice(index, 1);
return true;
}
return false;
}
}
if (!Array.prototype.pop_front) {
Array.prototype.pop_front = function <T>(): T {
if (this.length == 0) return undefined;
2018-02-27 16:20:49 +00:00
return this.splice(0, 1)[0];
}
}
if (!Array.prototype.toggle) {
Array.prototype.toggle = function <T>(element: T, insert?: boolean): boolean {
const index = this.findIndex(e => e === element);
if ((index !== -1) === insert) {
2021-03-12 16:46:27 +00:00
return false;
} else if (index === -1) {
this.push(element);
return true;
} else {
this.splice(index, 1);
2021-03-12 16:46:27 +00:00
return typeof insert === "boolean";
}
}
}
2018-04-16 18:38:35 +00:00
if (!Array.prototype.last) {
Array.prototype.last = function () {
if (this.length == 0) return undefined;
2018-02-27 16:20:49 +00:00
return this[this.length - 1];
};
}
if (typeof ($) !== "undefined") {
if (!$.spawn) {
$.spawn = function <K extends keyof HTMLElementTagNameMap>(tagName: K): JQuery<HTMLElementTagNameMap[K]> {
return $(document.createElement(tagName) as any);
2018-04-11 15:56:09 +00:00
}
2018-02-27 16:20:49 +00:00
}
2020-03-30 11:44:18 +00:00
if (!$.fn.renderTag) {
$.fn.renderTag = function (this: JQuery, values?: any): JQuery {
let result;
const template = $.views.templates[this.attr("id")];
if (!template) {
console.error("Tried to render template %o, but template is not available!", this.attr("id"));
throw "missing template " + this.attr("id");
}
/*
result = window.jsrender.templates("tmpl_permission_entry", $("#tmpl_permission_entry").html());
result = window.jsrender.templates("xxx", this.html());
*/
result = template(values);
result = $(result);
2018-09-30 20:36:17 +00:00
result.find("node").each((index, element) => {
2018-11-03 23:39:29 +00:00
$(element).replaceWith(values[$(element).attr("key")] || (values[0] || [])[$(element).attr("key")]);
2018-09-30 20:36:17 +00:00
});
2018-09-30 19:50:59 +00:00
return result;
}
}
if (!$.fn.hasScrollBar)
$.fn.hasScrollBar = function (direction?: "height" | "width") {
if (this.length <= 0)
2019-04-04 19:47:52 +00:00
return false;
const scroll_height = this.get(0).scrollHeight > this.height();
const scroll_width = this.get(0).scrollWidth > this.width();
if (typeof (direction) === "string") {
if (direction === "height")
2019-04-04 19:47:52 +00:00
return scroll_height;
if (direction === "width")
2019-04-04 19:47:52 +00:00
return scroll_width;
}
return scroll_width || scroll_height;
};
2018-12-23 16:41:14 +00:00
if (!$.fn.visible_height)
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 15:08:10 +00:00
$.fn.visible_height = function (this: JQuery<HTMLElement>) {
const original_style = this.attr("style");
this.css({
position: 'absolute!important',
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 15:08:10 +00:00
visibility: 'hidden!important',
display: 'block!important'
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 15:08:10 +00:00
});
const result = this.height();
this.attr("style", original_style || "");
return result;
2020-03-30 11:44:18 +00:00
};
if (!$.fn.visible_width)
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 15:08:10 +00:00
$.fn.visible_width = function (this: JQuery<HTMLElement>) {
const original_style = this.attr("style");
this.css({
position: 'absolute!important',
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 15:08:10 +00:00
visibility: 'hidden!important',
display: 'block!important'
Implemented the Material Design and fixed some bugs (#33) * cleaned up some files * Fundamental style update * Redesigned some style * fixed hostbanner popup * Removed old identity stuff * fixed close listener * Fixed changelog date * fixed release chat icons * fixed url * Fixed hostbanner * Uploaded missing images * Improved update handling * Improved script files * Fixed loading error and icon error * fixed Yes/No modal * Fixed loader issues with MS Edge * fixed modal style bug * Fixed control bar overflow for small devices * Improved error handling on identity creation * Logging generate error to terminal * fixed possible php error * fixed some possible loading errors when other files have'nt been already loaded. * removed debug message * Changed emsrcypten flags * Improved codec error handling * removed webassembly as required dependency * Improved and fixed channel tree issues * Improved the sliders * Removed unneeded files * fixed loader versions cache * second slight performance improved (dont animate elements anymore if they are not shown) * Fixed query visibility setting * not showing useless client infos for query clients * Added an auto reconnect system * Added a canceled message and increased reconnect interval * removed implemented todo * fixed repetitive channel names * Reworked the channel tree selected lines * Fixed channel tree names * Fixed name alignment * fixed the native client * added min width to the server select groups to avoid a disappearing effect on shrink * fixed bugged downloaded icons
2019-02-17 15:08:10 +00:00
});
const result = this.width();
this.attr("style", original_style || "");
return result;
2020-03-30 11:44:18 +00:00
};
if (!$.fn.firstParent)
2019-08-21 08:00:01 +00:00
$.fn.firstParent = function (this: JQuery<HTMLElement>, selector: string) {
if (this.is(selector))
2019-08-21 08:00:01 +00:00
return this;
return this.parent(selector);
}
2018-02-27 16:20:49 +00:00
}
if (!Object.values) {
2020-06-15 14:56:05 +00:00
Object.values = object => Object.keys(object).map(e => object[e]);
2021-04-05 21:05:44 +00:00
}
export function crashOnThrow<T>(promise: Promise<T> | (() => Promise<T>)): Promise<T> {
if (typeof promise === "function") {
2021-04-05 21:05:44 +00:00
try {
promise = promise();
} catch (error) {
promise = Promise.reject(error);
}
}
return promise.catch(error => {
/* TODO: Crash screen of the app? */
logError(LogCategory.GENERAL, tr("Critical app error: %o"), error);
/* Lets make this promise stuck for ever */
return new Promise(() => { });
2021-04-05 21:05:44 +00:00
});
}
export function ignorePromise<T>(_promise: Promise<T>) { }
2021-04-05 21:05:44 +00:00
export function NoThrow(target: any, methodName: string, descriptor: PropertyDescriptor) {
const crashApp = error => {
/* TODO: Crash screen of the app? */
logError(LogCategory.GENERAL, tr("Critical app error: %o"), error);
};
const promiseAccepted = { value: false };
const originalMethod: Function = descriptor.value;
descriptor.value = function () {
try {
const result = originalMethod.apply(this, arguments);
if (result instanceof Promise) {
2021-04-05 21:05:44 +00:00
promiseAccepted.value = true;
return result.catch(error => {
crashApp(error);
/* Lets make this promise stuck for ever since we're in a not well defined state */
return new Promise(() => { });
2021-04-05 21:05:44 +00:00
});
}
return result;
} catch (error) {
crashApp(error);
if (!promiseAccepted.value) {
2021-04-05 21:05:44 +00:00
throw error;
} else {
/*
* We don't know if we can return a promise or if just the object is expected.
* Since we don't know that, we're just rethrowing the error for now.
*/
return new Promise(() => { });
2021-04-05 21:05:44 +00:00
}
}
};
}
const kCallOnceSymbol = Symbol("call-once-data");
export function CallOnce(target: any, methodName: string, descriptor: PropertyDescriptor) {
const callOnceData = target[kCallOnceSymbol] || (target[kCallOnceSymbol] = {});
const originalMethod: Function = descriptor.value;
descriptor.value = function () {
if (callOnceData[methodName]) {
2021-04-05 21:05:44 +00:00
debugger;
throw "method " + methodName + " has already been called";
}
return originalMethod.apply(this, arguments);
};
}
const kNonNullSymbol = Symbol("non-null-data");
export function NonNull(target: any, methodName: string, parameterIndex: number) {
const nonNullInfo = target[kNonNullSymbol] || (target[kNonNullSymbol] = {});
const methodInfo = nonNullInfo[methodName] || (nonNullInfo[methodName] = {});
if (!Array.isArray(methodInfo.indexes)) {
2021-04-05 21:05:44 +00:00
/* Initialize method info */
methodInfo.overloaded = false;
methodInfo.indexes = [];
}
methodInfo.indexes.push(parameterIndex);
setImmediate(() => {
if (methodInfo.overloaded || methodInfo.missingWarned) {
2021-04-05 21:05:44 +00:00
return;
}
methodInfo.missingWarned = true;
logError(LogCategory.GENERAL, "Method %s has been constrained but the @Constrained decoration is missing.");
debugger;
});
}
/**
* The class or method has been constrained
*/
export function ParameterConstrained(target: any, methodName: string, descriptor: PropertyDescriptor) {
const nonNullInfo = target[kNonNullSymbol];
if (!nonNullInfo) {
2021-04-05 21:05:44 +00:00
return;
}
const methodInfo = nonNullInfo[methodName] || (nonNullInfo[methodName] = {});
if (!methodInfo) {
2021-04-05 21:05:44 +00:00
return;
}
methodInfo.overloaded = true;
const originalMethod: Function = descriptor.value;
descriptor.value = function () {
for (let index = 0; index < methodInfo.indexes.length; index++) {
2021-04-05 21:05:44 +00:00
const argument = arguments[methodInfo.indexes[index]];
if (typeof argument === undefined || typeof argument === null) {
2021-04-05 21:05:44 +00:00
throw "parameter " + methodInfo.indexes[index] + " should not be null or undefined";
}
}
return originalMethod.apply(this, arguments);
};
}
class TestClass {
@NoThrow
noThrow0() { }
@NoThrow
async noThrow1() {
await new Promise(resolve => setTimeout(resolve, 1));
}
@NoThrow
noThrow2() { throw "expected"; }
@NoThrow
async noThrow3() {
await new Promise(resolve => setTimeout(resolve, 1));
throw "expected";
}
@ParameterConstrained
nonNull0(@NonNull value: number) {
}
}
(window as any).TestClass = TestClass;