uicore-ts 1.1.10 → 1.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -56,10 +56,20 @@ export declare class UILazyPropertyValue<T> {
|
|
|
56
56
|
setLazyPropertyValue(key: string, target: object): void;
|
|
57
57
|
}
|
|
58
58
|
export declare function LAZY_VALUE<T>(initFunction: () => T): UILazyPropertyValue<T>;
|
|
59
|
+
type NativeGlobal = Date | RegExp | Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any> | Error;
|
|
60
|
+
export type UIInitializerValue<T> = T extends Function ? UIFunctionCall<T> | UIFunctionCall<T>[] | UIFunctionExtender<T> | T : T extends any[] ? T : T extends NativeGlobal ? T : T extends object ? UIInitializerObject<T> | T : T;
|
|
59
61
|
export type UIInitializerObject<T> = {
|
|
60
|
-
[P in keyof T]?:
|
|
62
|
+
[P in keyof T]?: UIInitializerValue<T[P]>;
|
|
61
63
|
};
|
|
62
|
-
export
|
|
64
|
+
export interface Configurable {
|
|
65
|
+
configureWithObject<K extends keyof this>(object: {
|
|
66
|
+
[P in K]?: UIInitializerValue<this[P]>;
|
|
67
|
+
}): void;
|
|
68
|
+
configuredWithObject<K extends keyof this>(object: {
|
|
69
|
+
[P in K]?: UIInitializerValue<this[P]>;
|
|
70
|
+
}): this;
|
|
71
|
+
}
|
|
72
|
+
export declare class UIObject implements Configurable {
|
|
63
73
|
constructor();
|
|
64
74
|
get class(): any;
|
|
65
75
|
get superclass(): any;
|
|
@@ -75,9 +85,17 @@ export declare class UIObject {
|
|
|
75
85
|
static valueForKeyPath<T = any>(keyPath: string, object: any, defaultValue?: T): T | undefined;
|
|
76
86
|
setValueForKeyPath(keyPath: string, value: any, createPath?: boolean): boolean;
|
|
77
87
|
static setValueForKeyPath(keyPath: string, value: any, currentObject: any, createPath: boolean): boolean;
|
|
78
|
-
configureWithObject
|
|
79
|
-
|
|
80
|
-
|
|
88
|
+
configureWithObject<K extends keyof this>(object: {
|
|
89
|
+
[P in K]?: UIInitializerValue<this[P]>;
|
|
90
|
+
}): { [P in K]?: UIInitializerValue<this[P]> | undefined; };
|
|
91
|
+
configuredWithObject<K extends keyof this>(object: {
|
|
92
|
+
[P in K]?: UIInitializerValue<this[P]>;
|
|
93
|
+
}): this;
|
|
94
|
+
static configureWithObject<TargetType extends object, ConfigKeys extends keyof TargetType>(configurationTarget: TargetType, object: {
|
|
95
|
+
[P in ConfigKeys]?: UIInitializerValue<TargetType[P]>;
|
|
96
|
+
}): {
|
|
97
|
+
[P in ConfigKeys]?: UIInitializerValue<TargetType[P]>;
|
|
98
|
+
};
|
|
81
99
|
static configuredWithObject<T extends object>(configurationTarget: T, object: UIInitializerObject<T>): T;
|
|
82
100
|
get methods(): MethodsOnly<Omit<this, "methods">>;
|
|
83
101
|
performFunctionWithSelf<T>(functionToPerform: (self: this) => T): T;
|
|
@@ -88,3 +106,4 @@ export type MethodsOnly<T> = Pick<T, {
|
|
|
88
106
|
[K in keyof T]: T[K] extends Function ? K : never;
|
|
89
107
|
}[keyof T]>;
|
|
90
108
|
export type ValueOf<T> = T[keyof T];
|
|
109
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../scripts/UIObject.ts"],
|
|
4
|
-
"sourcesContent": ["import { UICoreExtensionValueObject } from \"./UICoreExtensionValueObject\"\nimport { UITimer } from \"./UITimer\"\n\n\nfunction NilFunction() {\n return nil\n}\n\n\n// The nil object avoids unnecessary crashes by allowing you to call any function or access any variable on it, returning nil\nexport var nil: any = new Proxy(Object.assign(NilFunction, { \"class\": null, \"className\": \"Nil\" }), {\n get(target, name) {\n if (name == Symbol.toPrimitive) {\n return function (hint: string) {\n if (hint == \"number\") {\n return 0\n }\n if (hint == \"string\") {\n return \"\"\n }\n return false\n }\n }\n if (name == \"toString\") {\n return function toString() {\n return \"\"\n }\n }\n return NilFunction()\n },\n set() {\n return NilFunction()\n }\n})\nwindow.nil = nil\n\ndeclare global {\n interface Window {\n nil: any;\n }\n}\n\n\nexport type RecursiveRequired<T> = Required<{\n [P in keyof T]: T[P] extends object | undefined ? RecursiveRequired<Required<T[P]>> : T[P];\n}>;\n\nexport function wrapInNil<T>(object?: T): Required<T> {\n let result = FIRST_OR_NIL(object)\n if (object instanceof Object && !(object instanceof Function)) {\n result = new Proxy(object as Object & T, {\n get(target, name) {\n if (name == \"wrapped_nil_target\") {\n return target\n }\n const value = Reflect.get(target, name)\n if (typeof value === \"object\") {\n return wrapInNil(value)\n }\n if (IS_NOT_LIKE_NULL(value)) {\n return value\n }\n return nil\n },\n set(target: Record<string, any> & T, name: string, value: any) {\n if (IS(target)) {\n // @ts-ignore\n target[name] = value\n }\n return YES\n }\n })\n }\n return result as any\n}\n\n\nexport const YES = true\nexport const NO = false\n\nexport function IS<T>(object: T | undefined | null | false): object is T {\n if (object && object !== nil) {\n return YES\n }\n return NO\n}\n\nexport function IS_NOT(object: any): object is undefined | null | false {\n return !IS(object)\n}\n\nexport function IS_DEFINED<T>(object: T | undefined): object is T {\n if (object != undefined) {\n return YES\n }\n return NO\n}\n\nexport function IS_UNDEFINED(object: any): object is undefined {\n return !IS_DEFINED(object)\n}\n\nexport function IS_NIL(object: any): object is typeof nil {\n if (object === nil) {\n return YES\n }\n return NO\n}\n\nexport function IS_NOT_NIL<T>(object: T | undefined | null): object is T | undefined | null {\n return !IS_NIL(object)\n}\n\n\nexport function IS_LIKE_NULL(object: any): object is undefined | null {\n return (IS_UNDEFINED(object) || IS_NIL(object) || object == null)\n}\n\nexport function IS_NOT_LIKE_NULL<T>(object: T | null | undefined): object is T {\n return !IS_LIKE_NULL(object)\n}\n\n\nexport function IS_AN_EMAIL_ADDRESS(email: string) {\n const re = /\\S+@\\S+\\.\\S+/\n return re.test(email)\n}\n\n\nexport function FIRST_OR_NIL<T>(...objects: (T | undefined | null)[]): T {\n const result = objects.find(object => IS(object))\n return result || nil\n}\n\nexport function FIRST<T>(...objects: (T | undefined | null)[]): T {\n const result = objects.find(object => IS(object))\n return result || IF(IS_DEFINED(objects.lastElement))(RETURNER(objects.lastElement))()\n}\n\n\nexport function MAKE_ID(randomPartLength = 15) {\n let result = \"\"\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"\n for (let i = 0; i < randomPartLength; i++) {\n result = result + characters.charAt(Math.floor(Math.random() * characters.length))\n }\n result = result + Date.now()\n return result\n}\n\n\nexport function RETURNER<T>(value?: T) {\n return (..._objects: any[]) => value\n}\n\n\nexport type UIIFBlockReceiver<T> = (functionToCall: () => any) => UIIFEvaluator<T>;\nexport type UIIFEvaluatorBase<T> = () => T;\n\n\nexport interface UIIFEvaluator<T> extends UIIFEvaluatorBase<T> {\n ELSE_IF: (otherValue: any) => UIIFBlockReceiver<T>;\n ELSE: (functionToCall: () => any) => T;\n}\n\n\nexport function IF<T = any>(value: any): UIIFBlockReceiver<T> {\n \n let thenFunction = nil\n let elseFunction = nil\n \n const result: any = function (functionToCall: () => T) {\n thenFunction = functionToCall\n return result.evaluateConditions\n }\n \n result.evaluateConditions = function () {\n if (IS(value)) {\n return thenFunction()\n }\n return elseFunction()\n }\n \n result.evaluateConditions.ELSE_IF = function (otherValue: any) {\n \n const functionResult = IF(otherValue) as (UIIFBlockReceiver<T> & { evaluateConditions: UIIFEvaluator<T> })\n elseFunction = functionResult.evaluateConditions\n \n const functionResultEvaluateConditionsFunction: any = function () {\n return result.evaluateConditions()\n }\n functionResultEvaluateConditionsFunction.ELSE_IF = functionResult.evaluateConditions.ELSE_IF\n functionResultEvaluateConditionsFunction.ELSE = functionResult.evaluateConditions.ELSE\n \n functionResult.evaluateConditions = functionResultEvaluateConditionsFunction\n \n return functionResult\n \n }\n \n result.evaluateConditions.ELSE = function (functionToCall: () => T) {\n elseFunction = functionToCall\n return result.evaluateConditions()\n }\n \n return result\n}\n\n\nexport class UIFunctionCall<T extends (...args: any) => any> {\n \n isAUIFunctionCallObject = YES\n parameters: Parameters<T>[]\n \n constructor(...parameters: Parameters<T>) {\n this.parameters = parameters\n }\n \n callFunction(functionToCall: T) {\n const parameters = this.parameters\n functionToCall(...parameters)\n }\n \n}\n\n\nexport function CALL<T extends (...args: any) => any>(...objects: Parameters<T>) {\n return new UIFunctionCall<T>(...objects)\n}\n\n\nexport class UIFunctionExtender<T extends (...args: any) => any> {\n \n isAUIFunctionExtenderObject = YES\n extendingFunction: T\n \n static functionByExtendingFunction<T extends (...args: any) => any>(functionToExtend: T, extendingFunction: T) {\n return EXTEND(extendingFunction).extendedFunction(functionToExtend)\n }\n \n constructor(extendingFunction: T) {\n this.extendingFunction = extendingFunction\n }\n \n extendedFunction(functionToExtend: T): T & { extendedFunction: T } {\n const extendingFunction = this.extendingFunction\n \n function extendedFunction(this: any, ...objects: any[]) {\n const boundFunctionToExtend = functionToExtend.bind(this)\n boundFunctionToExtend(...objects)\n const boundExtendingFunction = extendingFunction.bind(this)\n boundExtendingFunction(...objects)\n }\n \n extendedFunction.extendedFunction = functionToExtend\n return extendedFunction as any\n }\n \n}\n\n\nexport function EXTEND<T extends (...args: any) => any>(extendingFunction: T) {\n return new UIFunctionExtender(extendingFunction)\n}\n\n\nexport class UILazyPropertyValue<T> {\n \n isAUILazyPropertyValueObject = YES\n initFunction: () => T\n \n constructor(initFunction: () => T) {\n this.initFunction = initFunction\n }\n \n setLazyPropertyValue(key: string, target: object) {\n \n let isValueInitialized = NO\n \n // property value\n let _value = nil\n \n const initValue = () => {\n _value = this.initFunction()\n isValueInitialized = YES\n this.initFunction = nil\n }\n \n // @ts-ignore\n if (delete target[key]) {\n \n // Create new property with getter and setter\n Object.defineProperty(target, key, {\n get: function () {\n if (IS_NOT(isValueInitialized)) {\n initValue()\n }\n return _value\n },\n set: function (newValue) {\n _value = newValue\n },\n enumerable: true,\n configurable: true\n })\n \n }\n \n }\n \n}\n\n\nexport function LAZY_VALUE<T>(initFunction: () => T) {\n return new UILazyPropertyValue(initFunction)\n}\n\n\nexport type UIInitializerObject<T> = {\n \n [P in keyof T]?:\n //T[P] extends (infer U)[] ? UIInitializerObject<U>[] :\n T[P] extends (...args: any) => any ? UIFunctionCall<T[P]> | UIFunctionCall<T[P]>[] | UIFunctionExtender<T[P]> | T[P] :\n T[P] extends object ? UIInitializerObject<T[P]> | UILazyPropertyValue<T[P]> :\n Partial<T[P]>;\n \n}\n\n\nexport class UIObject {\n \n constructor() {\n \n // Do something here if needed\n \n }\n \n public get class(): any {\n return Object.getPrototypeOf(this).constructor\n }\n \n public get superclass(): any {\n return Object.getPrototypeOf(Object.getPrototypeOf(this)).constructor\n }\n \n isKindOfClass(classObject: any) {\n if (this.isMemberOfClass(classObject)) {\n return YES\n }\n for (let superclassObject = this.superclass; IS(superclassObject); superclassObject = superclassObject.superclass) {\n if (superclassObject == classObject) {\n return YES\n }\n }\n return NO\n }\n \n \n isMemberOfClass(classObject: any) {\n return (this.class == classObject)\n }\n \n \n static annotationsMap: WeakMap<any, Function[]> = new WeakMap<ClassDecoratorContext, Function[]>()\n \n static recordAnnotation(annotation: Function, target: Function) {\n if (!UIObject.annotationsMap.has(target)) {\n UIObject.annotationsMap.set(target, [])\n }\n UIObject.annotationsMap.get(target)!.push(annotation)\n }\n \n static classHasAnnotation(classObject: Function, annotation: Function) {\n return UIObject.annotationsMap.get(classObject)?.contains(annotation)\n }\n \n static annotationsOnClass(classObject: Function) {\n return UIObject.annotationsMap.get(classObject) ?? []\n }\n \n public static wrapObject<T>(object: T): UIObject & T {\n if (IS_NOT(object)) {\n return nil\n }\n \n if ((object as any) instanceof UIObject) {\n // @ts-ignore\n return object\n }\n \n return Object.assign(new UIObject(), object)\n }\n \n \n valueForKey(key: string) {\n // @ts-ignore\n return this[key]\n }\n \n valueForKeyPath<T = any>(keyPath: string, defaultValue?: T): T | undefined {\n return UIObject.valueForKeyPath(keyPath, this, defaultValue)\n }\n \n static valueForKeyPath<T = any>(keyPath: string, object: any, defaultValue?: T): T | undefined {\n \n if (IS_NOT(keyPath)) {\n return object\n }\n \n const keys = keyPath.split(\".\")\n let currentObject = object\n \n for (let i = 0; i < keys.length; i++) {\n \n const key = keys[i]\n \n if (key.substring(0, 2) == \"[]\") {\n \n // This next object will be an array and the rest of the keys need to be run for each of the elements\n currentObject = currentObject[key.substring(2)]\n \n // CurrentObject is now an array\n \n const remainingKeyPath = keys.slice(i + 1).join(\".\")\n const currentArray = currentObject as unknown as any[]\n currentObject = currentArray.map(subObject => UIObject.valueForKeyPath(remainingKeyPath, subObject))\n \n break\n \n }\n \n currentObject = currentObject?.[key]\n if (IS_LIKE_NULL(currentObject)) {\n currentObject = defaultValue\n }\n \n }\n \n return currentObject\n \n }\n \n setValueForKeyPath(keyPath: string, value: any, createPath = YES) {\n return UIObject.setValueForKeyPath(keyPath, value, this, createPath)\n }\n \n static setValueForKeyPath(keyPath: string, value: any, currentObject: any, createPath: boolean) {\n \n const keys = keyPath.split(\".\")\n let didSetValue = NO\n \n keys.forEach((key, index, array) => {\n if (index == array.length - 1 && IS_NOT_LIKE_NULL(currentObject)) {\n currentObject[key] = value\n didSetValue = YES\n return\n }\n else if (IS_NOT(currentObject)) {\n return\n }\n \n const currentObjectValue = currentObject[key]\n if (IS_LIKE_NULL(currentObjectValue) && createPath) {\n currentObject[key] = {}\n }\n currentObject = currentObject[key]\n })\n \n return didSetValue\n \n }\n \n \n configureWithObject(object: UIInitializerObject<this>) {\n \n return UIObject.configureWithObject(this, object)\n \n }\n \n configuredWithObject(object: UIInitializerObject<this>): this {\n \n this.configureWithObject(object)\n return this\n \n }\n \n \n static configureWithObject<TargetObjectType extends object, ConfigurationObjectType extends UIInitializerObject<TargetObjectType>>(\n configurationTarget: TargetObjectType,\n object: ConfigurationObjectType\n ): ConfigurationObjectType {\n \n const isAnObject = (item: any) => (item && typeof item === \"object\" && !Array.isArray(item) && !(item instanceof UICoreExtensionValueObject))\n const isAPureObject = (item: any) => isAnObject(item) && Object.getPrototypeOf(item) === Object.getPrototypeOf({})\n \n function isAClass(funcOrClass: object) {\n if (IS_NOT(funcOrClass)) {\n return NO\n }\n const isFunction = (functionToCheck: object) => (functionToCheck && {}.toString.call(functionToCheck) ===\n \"[object Function]\")\n const propertyNames = Object.getOwnPropertyNames(funcOrClass)\n return (isFunction(funcOrClass) && !propertyNames.includes(\"arguments\") &&\n propertyNames.includes(\"prototype\"))\n }\n \n const result = {} as ConfigurationObjectType\n \n let keyPathsAndValues: { value: any, keyPath: string }[] = []\n \n function prepareKeyPathsAndValues(target: Record<string, any>, source: object, keyPath = \"\") {\n \n if ((isAnObject(target) || isAClass(target)) && isAnObject(source)) {\n \n source.forEach((sourceValue, key) => {\n \n const valueKeyPath = keyPath + \".\" + key\n \n function addValueAndKeyPath(sourceValue: any) {\n keyPathsAndValues.push({\n value: sourceValue,\n keyPath: valueKeyPath.replace(\".\", \"\")\n })\n }\n \n \n if (isAPureObject(sourceValue) || isAClass(sourceValue)) {\n if (!(key in target) || target[key] instanceof Function) {\n addValueAndKeyPath(sourceValue)\n }\n else {\n prepareKeyPathsAndValues(target[key], sourceValue, valueKeyPath)\n }\n }\n else if (sourceValue instanceof UICoreExtensionValueObject) {\n addValueAndKeyPath(sourceValue.value)\n }\n else {\n addValueAndKeyPath(sourceValue)\n }\n \n })\n \n }\n \n }\n \n prepareKeyPathsAndValues(configurationTarget, object)\n \n // Sort based on key path lengths\n keyPathsAndValues = keyPathsAndValues.sort((a, b) => {\n \n const firstKeyPath = (a.keyPath as string).split(\".\").length\n const secondKeyPath = (b.keyPath as string).split(\".\").length\n \n if (firstKeyPath < secondKeyPath) {\n return -1\n }\n if (firstKeyPath > secondKeyPath) {\n return 1\n }\n return 0\n \n })\n \n keyPathsAndValues.forEach((valueAndKeyPath) => {\n \n const keyPath: string = valueAndKeyPath.keyPath\n let value = valueAndKeyPath.value\n \n const getTargetFunction = (bindThis = NO) => {\n let result = (UIObject.valueForKeyPath(keyPath, configurationTarget) as Function)\n if (bindThis) {\n const indexOfDot = keyPath.lastIndexOf(\".\")\n const thisObject = UIObject.valueForKeyPath(keyPath.substring(0, indexOfDot), configurationTarget)\n result = result.bind(thisObject)\n }\n return result\n }\n \n if (value instanceof UILazyPropertyValue) {\n const indexOfDot = keyPath.lastIndexOf(\".\")\n const thisObject = UIObject.valueForKeyPath(keyPath.substring(0, indexOfDot), configurationTarget)\n const key = keyPath.substring(indexOfDot + 1)\n value.setLazyPropertyValue(key, thisObject)\n return\n }\n \n if (value instanceof UIFunctionCall) {\n value.callFunction(getTargetFunction(YES))\n return\n }\n if ((value instanceof Array && value.allMatch(element => element instanceof UIFunctionCall))) {\n value.map(element => element.callFunction(getTargetFunction(YES)))\n return\n }\n \n if (value instanceof UIFunctionExtender) {\n value = value.extendedFunction(getTargetFunction())\n }\n \n UIObject.setValueForKeyPath(keyPath, UIObject.valueForKeyPath(keyPath, configurationTarget), result, YES)\n UIObject.setValueForKeyPath(keyPath, value, configurationTarget, YES)\n \n })\n \n \n return result\n \n }\n \n static configuredWithObject<T extends object>(configurationTarget: T, object: UIInitializerObject<T>) {\n this.configureWithObject(configurationTarget, object)\n return configurationTarget\n }\n \n \n get methods(): MethodsOnly<Omit<this, \"methods\">> {\n const thisObject = this as object\n const result = {} as any\n thisObject.forEach((value, key) => {\n if (value instanceof Function && key != \"methods\") {\n result[key] = value.bind(thisObject)\n }\n })\n return result\n }\n \n \n performFunctionWithSelf<T>(functionToPerform: (self: this) => T): T {\n return functionToPerform(this)\n }\n \n performingFunctionWithSelf(functionToPerform: (self: this) => void): this {\n functionToPerform(this)\n return this\n }\n \n performFunctionWithDelay(delay: number, functionToCall: Function) {\n \n new UITimer(delay, NO, functionToCall)\n \n }\n \n \n}\n\n\nexport type MethodsOnly<T> =\n Pick<T, { [K in keyof T]: T[K] extends Function ? K : never }[keyof T]>;\n\nexport type ValueOf<T> = T[keyof T];\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { UICoreExtensionValueObject } from \"./UICoreExtensionValueObject\"\nimport { UITimer } from \"./UITimer\"\n\n\nfunction NilFunction() {\n return nil\n}\n\n\n// The nil object avoids unnecessary crashes by allowing you to call any function or access any variable on it, returning nil\nexport var nil: any = new Proxy(Object.assign(NilFunction, { \"class\": null, \"className\": \"Nil\" }), {\n get(target, name) {\n if (name == Symbol.toPrimitive) {\n return function (hint: string) {\n if (hint == \"number\") {\n return 0\n }\n if (hint == \"string\") {\n return \"\"\n }\n return false\n }\n }\n if (name == \"toString\") {\n return function toString() {\n return \"\"\n }\n }\n return NilFunction()\n },\n set() {\n return NilFunction()\n }\n})\nwindow.nil = nil\n\ndeclare global {\n interface Window {\n nil: any;\n }\n}\n\n\nexport type RecursiveRequired<T> = Required<{\n [P in keyof T]: T[P] extends object | undefined ? RecursiveRequired<Required<T[P]>> : T[P];\n}>;\n\nexport function wrapInNil<T>(object?: T): Required<T> {\n let result = FIRST_OR_NIL(object)\n if (object instanceof Object && !(object instanceof Function)) {\n result = new Proxy(object as Object & T, {\n get(target, name) {\n if (name == \"wrapped_nil_target\") {\n return target\n }\n const value = Reflect.get(target, name)\n if (typeof value === \"object\") {\n return wrapInNil(value)\n }\n if (IS_NOT_LIKE_NULL(value)) {\n return value\n }\n return nil\n },\n set(target: Record<string, any> & T, name: string, value: any) {\n if (IS(target)) {\n // @ts-ignore\n target[name] = value\n }\n return YES\n }\n })\n }\n return result as any\n}\n\n\nexport const YES = true\nexport const NO = false\n\nexport function IS<T>(object: T | undefined | null | false): object is T {\n if (object && object !== nil) {\n return YES\n }\n return NO\n}\n\nexport function IS_NOT(object: any): object is undefined | null | false {\n return !IS(object)\n}\n\nexport function IS_DEFINED<T>(object: T | undefined): object is T {\n if (object != undefined) {\n return YES\n }\n return NO\n}\n\nexport function IS_UNDEFINED(object: any): object is undefined {\n return !IS_DEFINED(object)\n}\n\nexport function IS_NIL(object: any): object is typeof nil {\n if (object === nil) {\n return YES\n }\n return NO\n}\n\nexport function IS_NOT_NIL<T>(object: T | undefined | null): object is T | undefined | null {\n return !IS_NIL(object)\n}\n\n\nexport function IS_LIKE_NULL(object: any): object is undefined | null {\n return (IS_UNDEFINED(object) || IS_NIL(object) || object == null)\n}\n\nexport function IS_NOT_LIKE_NULL<T>(object: T | null | undefined): object is T {\n return !IS_LIKE_NULL(object)\n}\n\n\nexport function IS_AN_EMAIL_ADDRESS(email: string) {\n const re = /\\S+@\\S+\\.\\S+/\n return re.test(email)\n}\n\n\nexport function FIRST_OR_NIL<T>(...objects: (T | undefined | null)[]): T {\n const result = objects.find(object => IS(object))\n return result || nil\n}\n\nexport function FIRST<T>(...objects: (T | undefined | null)[]): T {\n const result = objects.find(object => IS(object))\n return result || IF(IS_DEFINED(objects.lastElement))(RETURNER(objects.lastElement))()\n}\n\n\nexport function MAKE_ID(randomPartLength = 15) {\n let result = \"\"\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"\n for (let i = 0; i < randomPartLength; i++) {\n result = result + characters.charAt(Math.floor(Math.random() * characters.length))\n }\n result = result + Date.now()\n return result\n}\n\n\nexport function RETURNER<T>(value?: T) {\n return (..._objects: any[]) => value\n}\n\n\nexport type UIIFBlockReceiver<T> = (functionToCall: () => any) => UIIFEvaluator<T>;\nexport type UIIFEvaluatorBase<T> = () => T;\n\n\nexport interface UIIFEvaluator<T> extends UIIFEvaluatorBase<T> {\n ELSE_IF: (otherValue: any) => UIIFBlockReceiver<T>;\n ELSE: (functionToCall: () => any) => T;\n}\n\n\nexport function IF<T = any>(value: any): UIIFBlockReceiver<T> {\n \n let thenFunction = nil\n let elseFunction = nil\n \n const result: any = function (functionToCall: () => T) {\n thenFunction = functionToCall\n return result.evaluateConditions\n }\n \n result.evaluateConditions = function () {\n if (IS(value)) {\n return thenFunction()\n }\n return elseFunction()\n }\n \n result.evaluateConditions.ELSE_IF = function (otherValue: any) {\n \n const functionResult = IF(otherValue) as (UIIFBlockReceiver<T> & { evaluateConditions: UIIFEvaluator<T> })\n elseFunction = functionResult.evaluateConditions\n \n const functionResultEvaluateConditionsFunction: any = function () {\n return result.evaluateConditions()\n }\n functionResultEvaluateConditionsFunction.ELSE_IF = functionResult.evaluateConditions.ELSE_IF\n functionResultEvaluateConditionsFunction.ELSE = functionResult.evaluateConditions.ELSE\n \n functionResult.evaluateConditions = functionResultEvaluateConditionsFunction\n \n return functionResult\n \n }\n \n result.evaluateConditions.ELSE = function (functionToCall: () => T) {\n elseFunction = functionToCall\n return result.evaluateConditions()\n }\n \n return result\n}\n\n\nexport class UIFunctionCall<T extends (...args: any) => any> {\n \n isAUIFunctionCallObject = YES\n parameters: Parameters<T>[]\n \n constructor(...parameters: Parameters<T>) {\n this.parameters = parameters\n }\n \n callFunction(functionToCall: T) {\n const parameters = this.parameters\n functionToCall(...parameters)\n }\n \n}\n\n\nexport function CALL<T extends (...args: any) => any>(...objects: Parameters<T>) {\n return new UIFunctionCall<T>(...objects)\n}\n\n\nexport class UIFunctionExtender<T extends (...args: any) => any> {\n \n isAUIFunctionExtenderObject = YES\n extendingFunction: T\n \n static functionByExtendingFunction<T extends (...args: any) => any>(functionToExtend: T, extendingFunction: T) {\n return EXTEND(extendingFunction).extendedFunction(functionToExtend)\n }\n \n constructor(extendingFunction: T) {\n this.extendingFunction = extendingFunction\n }\n \n extendedFunction(functionToExtend: T): T & { extendedFunction: T } {\n const extendingFunction = this.extendingFunction\n \n function extendedFunction(this: any, ...objects: any[]) {\n const boundFunctionToExtend = functionToExtend.bind(this)\n boundFunctionToExtend(...objects)\n const boundExtendingFunction = extendingFunction.bind(this)\n boundExtendingFunction(...objects)\n }\n \n extendedFunction.extendedFunction = functionToExtend\n return extendedFunction as any\n }\n \n}\n\n\nexport function EXTEND<T extends (...args: any) => any>(extendingFunction: T) {\n return new UIFunctionExtender(extendingFunction)\n}\n\n\nexport class UILazyPropertyValue<T> {\n \n isAUILazyPropertyValueObject = YES\n initFunction: () => T\n \n constructor(initFunction: () => T) {\n this.initFunction = initFunction\n }\n \n setLazyPropertyValue(key: string, target: object) {\n \n let isValueInitialized = NO\n \n // property value\n let _value = nil\n \n const initValue = () => {\n _value = this.initFunction()\n isValueInitialized = YES\n this.initFunction = nil\n }\n \n // @ts-ignore\n if (delete target[key]) {\n \n // Create new property with getter and setter\n Object.defineProperty(target, key, {\n get: function () {\n if (IS_NOT(isValueInitialized)) {\n initValue()\n }\n return _value\n },\n set: function (newValue) {\n _value = newValue\n },\n enumerable: true,\n configurable: true\n })\n \n }\n \n }\n \n}\n\n\nexport function LAZY_VALUE<T>(initFunction: () => T) {\n return new UILazyPropertyValue(initFunction)\n}\n\n\n// export type UIInitializerObject<T> = {\n//\n// [P in keyof T]?:\n// //T[P] extends (infer U)[] ? UIInitializerObject<U>[] :\n// T[P] extends (...args: any) => any ? UIFunctionCall<T[P]> | UIFunctionCall<T[P]>[] | UIFunctionExtender<T[P]> | T[P] :\n// T[P] extends object ? UIInitializerObject<T[P]> | UILazyPropertyValue<T[P]> :\n// Partial<T[P]>;\n//\n// }\n\n// 1. Native Global Types we DO NOT want to recurse into (Performance & Safety)\ntype NativeGlobal = Date | RegExp | Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any> | Error;\n\n// 2. The value type\nexport type UIInitializerValue<T> =\n// Handle Functions\n T extends Function\n //@ts-ignore\n ? UIFunctionCall<T> | UIFunctionCall<T>[] | UIFunctionExtender<T> | T\n // Handle Arrays (do not recurse)\n : T extends any[]\n ? T\n // Handle Native Globals (do not recurse)\n : T extends NativeGlobal\n ? T\n // Handle Objects (Plain Objects AND Class Instances)\n : T extends object\n ? UIInitializerObject<T> | T // <--- THE FIX: Allow Config OR Instance\n : T; // Primitives\n\n// 3. The recursive object type\nexport type UIInitializerObject<T> = {\n [P in keyof T]?: UIInitializerValue<T[P]>;\n};\n\n// 4. The optimized method (Lazy Evaluation)\nexport interface Configurable {\n \n configureWithObject<K extends keyof this>(object: { [P in K]?: UIInitializerValue<this[P]> }): void;\n configuredWithObject<K extends keyof this>(object: { [P in K]?: UIInitializerValue<this[P]> }): this;\n \n}\n\n\nexport class UIObject implements Configurable {\n \n constructor() {\n \n // Do something here if needed\n \n }\n \n public get class(): any {\n return Object.getPrototypeOf(this).constructor\n }\n \n public get superclass(): any {\n return Object.getPrototypeOf(Object.getPrototypeOf(this)).constructor\n }\n \n isKindOfClass(classObject: any) {\n if (this.isMemberOfClass(classObject)) {\n return YES\n }\n for (let superclassObject = this.superclass; IS(superclassObject); superclassObject = superclassObject.superclass) {\n if (superclassObject == classObject) {\n return YES\n }\n }\n return NO\n }\n \n \n isMemberOfClass(classObject: any) {\n return (this.class == classObject)\n }\n \n \n static annotationsMap: WeakMap<any, Function[]> = new WeakMap<ClassDecoratorContext, Function[]>()\n \n static recordAnnotation(annotation: Function, target: Function) {\n if (!UIObject.annotationsMap.has(target)) {\n UIObject.annotationsMap.set(target, [])\n }\n UIObject.annotationsMap.get(target)!.push(annotation)\n }\n \n static classHasAnnotation(classObject: Function, annotation: Function) {\n return UIObject.annotationsMap.get(classObject)?.contains(annotation)\n }\n \n static annotationsOnClass(classObject: Function) {\n return UIObject.annotationsMap.get(classObject) ?? []\n }\n \n public static wrapObject<T>(object: T): UIObject & T {\n if (IS_NOT(object)) {\n return nil\n }\n \n if ((object as any) instanceof UIObject) {\n // @ts-ignore\n return object\n }\n \n return Object.assign(new UIObject(), object)\n }\n \n \n valueForKey(key: string) {\n // @ts-ignore\n return this[key]\n }\n \n valueForKeyPath<T = any>(keyPath: string, defaultValue?: T): T | undefined {\n return UIObject.valueForKeyPath(keyPath, this, defaultValue)\n }\n \n static valueForKeyPath<T = any>(keyPath: string, object: any, defaultValue?: T): T | undefined {\n \n if (IS_NOT(keyPath)) {\n return object\n }\n \n const keys = keyPath.split(\".\")\n let currentObject = object\n \n for (let i = 0; i < keys.length; i++) {\n \n const key = keys[i]\n \n if (key.substring(0, 2) == \"[]\") {\n \n // This next object will be an array and the rest of the keys need to be run for each of the elements\n currentObject = currentObject[key.substring(2)]\n \n // CurrentObject is now an array\n \n const remainingKeyPath = keys.slice(i + 1).join(\".\")\n const currentArray = currentObject as unknown as any[]\n currentObject = currentArray.map(subObject => UIObject.valueForKeyPath(remainingKeyPath, subObject))\n \n break\n \n }\n \n currentObject = currentObject?.[key]\n if (IS_LIKE_NULL(currentObject)) {\n currentObject = defaultValue\n }\n \n }\n \n return currentObject\n \n }\n \n setValueForKeyPath(keyPath: string, value: any, createPath = YES) {\n return UIObject.setValueForKeyPath(keyPath, value, this, createPath)\n }\n \n static setValueForKeyPath(keyPath: string, value: any, currentObject: any, createPath: boolean) {\n \n const keys = keyPath.split(\".\")\n let didSetValue = NO\n \n keys.forEach((key, index, array) => {\n if (index == array.length - 1 && IS_NOT_LIKE_NULL(currentObject)) {\n currentObject[key] = value\n didSetValue = YES\n return\n }\n else if (IS_NOT(currentObject)) {\n return\n }\n \n const currentObjectValue = currentObject[key]\n if (IS_LIKE_NULL(currentObjectValue) && createPath) {\n currentObject[key] = {}\n }\n currentObject = currentObject[key]\n })\n \n return didSetValue\n \n }\n \n \n configureWithObject<K extends keyof this>(object: { [P in K]?: UIInitializerValue<this[P]> }) {\n \n return UIObject.configureWithObject(this, object)\n \n }\n \n configuredWithObject<K extends keyof this>(object: { [P in K]?: UIInitializerValue<this[P]> }): this {\n \n this.configureWithObject(object)\n return this\n \n }\n \n \n static configureWithObject<\n TargetType extends object,\n ConfigKeys extends keyof TargetType\n >(\n configurationTarget: TargetType,\n object: { [P in ConfigKeys]?: UIInitializerValue<TargetType[P]> }\n ): { [P in ConfigKeys]?: UIInitializerValue<TargetType[P]> } {\n \n const isAnObject = (item: any) => (item && typeof item === \"object\" && !Array.isArray(item) && !(item instanceof UICoreExtensionValueObject))\n const isAPureObject = (item: any) => isAnObject(item) && Object.getPrototypeOf(item) === Object.getPrototypeOf({})\n \n function isAClass(funcOrClass: object) {\n if (IS_NOT(funcOrClass)) {\n return NO\n }\n const isFunction = (functionToCheck: object) => (functionToCheck && {}.toString.call(functionToCheck) ===\n \"[object Function]\")\n const propertyNames = Object.getOwnPropertyNames(funcOrClass)\n return (isFunction(funcOrClass) && !propertyNames.includes(\"arguments\") &&\n propertyNames.includes(\"prototype\"))\n }\n \n const result = {} as any\n \n let keyPathsAndValues: { value: any, keyPath: string }[] = []\n \n function prepareKeyPathsAndValues(target: Record<string, any>, source: object, keyPath = \"\") {\n \n if ((isAnObject(target) || isAClass(target)) && isAnObject(source)) {\n \n source.forEach((sourceValue, key) => {\n \n const valueKeyPath = keyPath + \".\" + key\n \n function addValueAndKeyPath(sourceValue: any) {\n keyPathsAndValues.push({\n value: sourceValue,\n keyPath: valueKeyPath.replace(\".\", \"\")\n })\n }\n \n \n if (isAPureObject(sourceValue) || isAClass(sourceValue)) {\n if (!(key in target) || target[key] instanceof Function) {\n addValueAndKeyPath(sourceValue)\n }\n else {\n prepareKeyPathsAndValues(target[key], sourceValue, valueKeyPath)\n }\n }\n else if (sourceValue instanceof UICoreExtensionValueObject) {\n addValueAndKeyPath(sourceValue.value)\n }\n else {\n addValueAndKeyPath(sourceValue)\n }\n \n })\n \n }\n \n }\n \n prepareKeyPathsAndValues(configurationTarget, object)\n \n // Sort based on key path lengths\n keyPathsAndValues = keyPathsAndValues.sort((a, b) => {\n \n const firstKeyPath = (a.keyPath as string).split(\".\").length\n const secondKeyPath = (b.keyPath as string).split(\".\").length\n \n if (firstKeyPath < secondKeyPath) {\n return -1\n }\n if (firstKeyPath > secondKeyPath) {\n return 1\n }\n return 0\n \n })\n \n keyPathsAndValues.forEach((valueAndKeyPath) => {\n \n const keyPath: string = valueAndKeyPath.keyPath\n let value = valueAndKeyPath.value\n \n const getTargetFunction = (bindThis = NO) => {\n let result = (UIObject.valueForKeyPath(keyPath, configurationTarget) as Function)\n if (bindThis) {\n const indexOfDot = keyPath.lastIndexOf(\".\")\n const thisObject = UIObject.valueForKeyPath(keyPath.substring(0, indexOfDot), configurationTarget)\n result = result.bind(thisObject)\n }\n return result\n }\n \n if (value instanceof UILazyPropertyValue) {\n const indexOfDot = keyPath.lastIndexOf(\".\")\n const thisObject = UIObject.valueForKeyPath(keyPath.substring(0, indexOfDot), configurationTarget)\n const key = keyPath.substring(indexOfDot + 1)\n value.setLazyPropertyValue(key, thisObject)\n return\n }\n \n if (value instanceof UIFunctionCall) {\n value.callFunction(getTargetFunction(YES))\n return\n }\n if ((value instanceof Array && value.allMatch(element => element instanceof UIFunctionCall))) {\n value.map(element => element.callFunction(getTargetFunction(YES)))\n return\n }\n \n if (value instanceof UIFunctionExtender) {\n value = value.extendedFunction(getTargetFunction())\n }\n \n UIObject.setValueForKeyPath(keyPath, UIObject.valueForKeyPath(keyPath, configurationTarget), result, YES)\n UIObject.setValueForKeyPath(keyPath, value, configurationTarget, YES)\n \n })\n \n \n return result\n \n }\n \n static configuredWithObject<T extends object>(configurationTarget: T, object: UIInitializerObject<T>) {\n this.configureWithObject(configurationTarget, object)\n return configurationTarget\n }\n \n \n get methods(): MethodsOnly<Omit<this, \"methods\">> {\n const thisObject = this as object\n const result = {} as any\n thisObject.forEach((value, key) => {\n if (value instanceof Function && key != \"methods\") {\n result[key] = value.bind(thisObject)\n }\n })\n return result\n }\n \n \n performFunctionWithSelf<T>(functionToPerform: (self: this) => T): T {\n return functionToPerform(this)\n }\n \n performingFunctionWithSelf(functionToPerform: (self: this) => void): this {\n functionToPerform(this)\n return this\n }\n \n performFunctionWithDelay(delay: number, functionToCall: Function) {\n \n new UITimer(delay, NO, functionToCall)\n \n }\n \n \n}\n\n\nexport type MethodsOnly<T> =\n Pick<T, { [K in keyof T]: T[K] extends Function ? K : never }[keyof T]>;\n\nexport type ValueOf<T> = T[keyof T];\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["sourceValue", "result"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uicore-ts",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.15",
|
|
4
4
|
"description": "UICore is a library to build native-like user interfaces using pure Typescript. No HTML is needed at all. Components are described as TS classes and all user interactions are handled explicitly. This library is strongly inspired by the UIKit framework that is used in IOS. In addition, UICore has tools to handle URL based routing, array sorting and filtering and adds a number of other utilities for convenience.",
|
|
5
5
|
"main": "compiledScripts/index.js",
|
|
6
6
|
"types": "compiledScripts/index.d.ts",
|
package/scripts/UIObject.ts
CHANGED
|
@@ -316,18 +316,51 @@ export function LAZY_VALUE<T>(initFunction: () => T) {
|
|
|
316
316
|
}
|
|
317
317
|
|
|
318
318
|
|
|
319
|
+
// export type UIInitializerObject<T> = {
|
|
320
|
+
//
|
|
321
|
+
// [P in keyof T]?:
|
|
322
|
+
// //T[P] extends (infer U)[] ? UIInitializerObject<U>[] :
|
|
323
|
+
// T[P] extends (...args: any) => any ? UIFunctionCall<T[P]> | UIFunctionCall<T[P]>[] | UIFunctionExtender<T[P]> | T[P] :
|
|
324
|
+
// T[P] extends object ? UIInitializerObject<T[P]> | UILazyPropertyValue<T[P]> :
|
|
325
|
+
// Partial<T[P]>;
|
|
326
|
+
//
|
|
327
|
+
// }
|
|
328
|
+
|
|
329
|
+
// 1. Native Global Types we DO NOT want to recurse into (Performance & Safety)
|
|
330
|
+
type NativeGlobal = Date | RegExp | Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any> | Error;
|
|
331
|
+
|
|
332
|
+
// 2. The value type
|
|
333
|
+
export type UIInitializerValue<T> =
|
|
334
|
+
// Handle Functions
|
|
335
|
+
T extends Function
|
|
336
|
+
//@ts-ignore
|
|
337
|
+
? UIFunctionCall<T> | UIFunctionCall<T>[] | UIFunctionExtender<T> | T
|
|
338
|
+
// Handle Arrays (do not recurse)
|
|
339
|
+
: T extends any[]
|
|
340
|
+
? T
|
|
341
|
+
// Handle Native Globals (do not recurse)
|
|
342
|
+
: T extends NativeGlobal
|
|
343
|
+
? T
|
|
344
|
+
// Handle Objects (Plain Objects AND Class Instances)
|
|
345
|
+
: T extends object
|
|
346
|
+
? UIInitializerObject<T> | T // <--- THE FIX: Allow Config OR Instance
|
|
347
|
+
: T; // Primitives
|
|
348
|
+
|
|
349
|
+
// 3. The recursive object type
|
|
319
350
|
export type UIInitializerObject<T> = {
|
|
351
|
+
[P in keyof T]?: UIInitializerValue<T[P]>;
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
// 4. The optimized method (Lazy Evaluation)
|
|
355
|
+
export interface Configurable {
|
|
320
356
|
|
|
321
|
-
[P in
|
|
322
|
-
|
|
323
|
-
T[P] extends (...args: any) => any ? UIFunctionCall<T[P]> | UIFunctionCall<T[P]>[] | UIFunctionExtender<T[P]> | T[P] :
|
|
324
|
-
T[P] extends object ? UIInitializerObject<T[P]> | UILazyPropertyValue<T[P]> :
|
|
325
|
-
Partial<T[P]>;
|
|
357
|
+
configureWithObject<K extends keyof this>(object: { [P in K]?: UIInitializerValue<this[P]> }): void;
|
|
358
|
+
configuredWithObject<K extends keyof this>(object: { [P in K]?: UIInitializerValue<this[P]> }): this;
|
|
326
359
|
|
|
327
360
|
}
|
|
328
361
|
|
|
329
362
|
|
|
330
|
-
export class UIObject {
|
|
363
|
+
export class UIObject implements Configurable {
|
|
331
364
|
|
|
332
365
|
constructor() {
|
|
333
366
|
|
|
@@ -471,13 +504,13 @@ export class UIObject {
|
|
|
471
504
|
}
|
|
472
505
|
|
|
473
506
|
|
|
474
|
-
configureWithObject(object:
|
|
507
|
+
configureWithObject<K extends keyof this>(object: { [P in K]?: UIInitializerValue<this[P]> }) {
|
|
475
508
|
|
|
476
509
|
return UIObject.configureWithObject(this, object)
|
|
477
510
|
|
|
478
511
|
}
|
|
479
512
|
|
|
480
|
-
configuredWithObject(object:
|
|
513
|
+
configuredWithObject<K extends keyof this>(object: { [P in K]?: UIInitializerValue<this[P]> }): this {
|
|
481
514
|
|
|
482
515
|
this.configureWithObject(object)
|
|
483
516
|
return this
|
|
@@ -485,10 +518,13 @@ export class UIObject {
|
|
|
485
518
|
}
|
|
486
519
|
|
|
487
520
|
|
|
488
|
-
static configureWithObject<
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
521
|
+
static configureWithObject<
|
|
522
|
+
TargetType extends object,
|
|
523
|
+
ConfigKeys extends keyof TargetType
|
|
524
|
+
>(
|
|
525
|
+
configurationTarget: TargetType,
|
|
526
|
+
object: { [P in ConfigKeys]?: UIInitializerValue<TargetType[P]> }
|
|
527
|
+
): { [P in ConfigKeys]?: UIInitializerValue<TargetType[P]> } {
|
|
492
528
|
|
|
493
529
|
const isAnObject = (item: any) => (item && typeof item === "object" && !Array.isArray(item) && !(item instanceof UICoreExtensionValueObject))
|
|
494
530
|
const isAPureObject = (item: any) => isAnObject(item) && Object.getPrototypeOf(item) === Object.getPrototypeOf({})
|
|
@@ -504,7 +540,7 @@ export class UIObject {
|
|
|
504
540
|
propertyNames.includes("prototype"))
|
|
505
541
|
}
|
|
506
542
|
|
|
507
|
-
const result = {} as
|
|
543
|
+
const result = {} as any
|
|
508
544
|
|
|
509
545
|
let keyPathsAndValues: { value: any, keyPath: string }[] = []
|
|
510
546
|
|