@actdim/utico 1.2.6 → 1.2.7
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.
- package/dist/arrayExtensions.es.js +64 -38
- package/dist/arrayExtensions.es.js.map +1 -1
- package/dist/asyncLock.es.js +45 -30
- package/dist/asyncLock.es.js.map +1 -1
- package/dist/cache/cacheContracts.es.js +8 -4
- package/dist/cache/cacheContracts.es.js.map +1 -1
- package/dist/cache/memoryCache.es.js +28 -13
- package/dist/cache/memoryCache.es.js.map +1 -1
- package/dist/cache/persistentCache.es.js +174 -97
- package/dist/cache/persistentCache.es.js.map +1 -1
- package/dist/dataFormats.es.js +4 -4
- package/dist/dataFormats.es.js.map +1 -1
- package/dist/dateTimeDataFormat.es.js +211 -130
- package/dist/dateTimeDataFormat.es.js.map +1 -1
- package/dist/decorators.es.js +15 -11
- package/dist/decorators.es.js.map +1 -1
- package/dist/gfx/canvasUtils.es.js +197 -114
- package/dist/gfx/canvasUtils.es.js.map +1 -1
- package/dist/gfx/color.es.js +134 -68
- package/dist/gfx/color.es.js.map +1 -1
- package/dist/i18n/cultures.es.js +8 -8
- package/dist/i18n/cultures.es.js.map +1 -1
- package/dist/i18n/enUsCulture.es.js +2 -2
- package/dist/i18n/enUsCulture.es.js.map +1 -1
- package/dist/i18n/euCulture.es.js +2 -2
- package/dist/i18n/euCulture.es.js.map +1 -1
- package/dist/i18n/invariantCulture.es.js +2 -2
- package/dist/i18n/invariantCulture.es.js.map +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/math.es.js +14 -8
- package/dist/math.es.js.map +1 -1
- package/dist/metadata.es.js +53 -25
- package/dist/metadata.es.js.map +1 -1
- package/dist/patterns.es.js +5 -3
- package/dist/patterns.es.js.map +1 -1
- package/dist/store/dataStore.es.js +241 -157
- package/dist/store/dataStore.es.js.map +1 -1
- package/dist/store/persistentStore.es.js +23 -17
- package/dist/store/persistentStore.es.js.map +1 -1
- package/dist/store/storeContracts.es.js +7 -3
- package/dist/store/storeContracts.es.js.map +1 -1
- package/dist/store/storeDb.es.js +87 -50
- package/dist/store/storeDb.es.js.map +1 -1
- package/dist/stringCore.es.js +60 -22
- package/dist/stringCore.es.js.map +1 -1
- package/dist/structEvent.es.js +30 -17
- package/dist/structEvent.es.js.map +1 -1
- package/dist/typeCore.es.js +25 -11
- package/dist/typeCore.es.js.map +1 -1
- package/dist/typeUtils.es.js +292 -182
- package/dist/typeUtils.es.js.map +1 -1
- package/dist/utils.es.js +138 -84
- package/dist/utils.es.js.map +1 -1
- package/dist/watchable.es.js +50 -27
- package/dist/watchable.es.js.map +1 -1
- package/package.json +2 -2
package/dist/utils.es.js
CHANGED
|
@@ -1,114 +1,168 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import { v4 } from "uuid";
|
|
4
|
+
const normalize = /* @__PURE__ */ __name((v) => !v || !isFinite(v) ? 0 : v, "normalize");
|
|
5
|
+
const buildFuncArgCacheKey = /* @__PURE__ */ (() => {
|
|
6
|
+
const weakMap = /* @__PURE__ */ new WeakMap();
|
|
7
|
+
return (...args) => {
|
|
8
|
+
const keys = [];
|
|
9
|
+
for (const arg of args) {
|
|
10
|
+
let key = void 0;
|
|
11
|
+
if (typeof arg === "number" || typeof arg === "string" || typeof arg === "boolean" || arg == void 0) {
|
|
12
|
+
key = "" + arg;
|
|
13
|
+
} else {
|
|
14
|
+
key = weakMap.get(arg);
|
|
15
|
+
if (!key) {
|
|
16
|
+
key = v4();
|
|
17
|
+
weakMap.set(arg, key);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
keys.push(key);
|
|
9
21
|
}
|
|
10
|
-
return `"${
|
|
22
|
+
return `"${keys.join("/")}"`;
|
|
11
23
|
};
|
|
12
|
-
})()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
})();
|
|
25
|
+
const delay = /* @__PURE__ */ __name((ms, abortSignal) => {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
if (abortSignal?.aborted) {
|
|
28
|
+
reject(abortSignal.reason);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const id = setTimeout(resolve, ms);
|
|
32
|
+
abortSignal?.addEventListener("abort", () => {
|
|
33
|
+
clearTimeout(id);
|
|
34
|
+
reject(abortSignal.reason);
|
|
35
|
+
}, { once: true });
|
|
36
|
+
});
|
|
37
|
+
}, "delay");
|
|
38
|
+
const delayError = /* @__PURE__ */ __name(async (ms, errFactory, abortSignal) => {
|
|
39
|
+
await delay(ms, abortSignal);
|
|
40
|
+
throw errFactory ? errFactory() : new Error("Timeout exceeded");
|
|
41
|
+
}, "delayError");
|
|
42
|
+
function withTimeout(promise, ms, abortSignal) {
|
|
43
|
+
return Promise.race([delayError(ms, void 0, abortSignal), promise]);
|
|
26
44
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
45
|
+
__name(withTimeout, "withTimeout");
|
|
46
|
+
function searchTree(treeNodes, predicate, childSelector) {
|
|
47
|
+
if (!treeNodes) {
|
|
48
|
+
return void 0;
|
|
49
|
+
}
|
|
50
|
+
for (const treeNode of treeNodes) {
|
|
51
|
+
if (predicate(treeNode)) {
|
|
52
|
+
return treeNode;
|
|
35
53
|
}
|
|
54
|
+
const node = searchTree(childSelector(treeNode), predicate, childSelector);
|
|
55
|
+
if (node) {
|
|
56
|
+
return node;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return void 0;
|
|
36
60
|
}
|
|
37
|
-
|
|
38
|
-
|
|
61
|
+
__name(searchTree, "searchTree");
|
|
62
|
+
const suppressConsole = /* @__PURE__ */ __name((action) => {
|
|
63
|
+
const origConsole = {};
|
|
64
|
+
const result = [];
|
|
65
|
+
const keys = [
|
|
39
66
|
"log"
|
|
40
67
|
/*, "debug", "warn", "info"*/
|
|
41
68
|
];
|
|
42
|
-
for (const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
69
|
+
for (const key of keys) {
|
|
70
|
+
origConsole[key] = console[key];
|
|
71
|
+
console[key] = function(...args) {
|
|
72
|
+
result.push({
|
|
73
|
+
method: key,
|
|
74
|
+
args
|
|
47
75
|
});
|
|
48
76
|
};
|
|
77
|
+
}
|
|
49
78
|
try {
|
|
50
|
-
|
|
79
|
+
action();
|
|
51
80
|
} finally {
|
|
52
|
-
for (const
|
|
53
|
-
console[
|
|
81
|
+
for (const key of keys) {
|
|
82
|
+
console[key] = origConsole[key];
|
|
83
|
+
}
|
|
54
84
|
}
|
|
55
|
-
return
|
|
56
|
-
};
|
|
57
|
-
function
|
|
58
|
-
let
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
for (const
|
|
62
|
-
if (
|
|
63
|
-
|
|
85
|
+
return result;
|
|
86
|
+
}, "suppressConsole");
|
|
87
|
+
function removePrefix(str, prefixes) {
|
|
88
|
+
let removed = true;
|
|
89
|
+
while (removed) {
|
|
90
|
+
removed = false;
|
|
91
|
+
for (const prefix of prefixes) {
|
|
92
|
+
if (prefix && str.startsWith(prefix)) {
|
|
93
|
+
str = str.slice(prefix.length);
|
|
94
|
+
removed = true;
|
|
64
95
|
break;
|
|
65
96
|
}
|
|
97
|
+
}
|
|
66
98
|
}
|
|
67
|
-
return
|
|
99
|
+
return str;
|
|
68
100
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
101
|
+
__name(removePrefix, "removePrefix");
|
|
102
|
+
function removeSuffix(str, suffixes) {
|
|
103
|
+
let removed = true;
|
|
104
|
+
while (removed) {
|
|
105
|
+
removed = false;
|
|
106
|
+
for (const suffix of suffixes) {
|
|
107
|
+
if (suffix && str.endsWith(suffix)) {
|
|
108
|
+
str = str.slice(0, -suffix.length);
|
|
109
|
+
removed = true;
|
|
76
110
|
break;
|
|
77
111
|
}
|
|
112
|
+
}
|
|
78
113
|
}
|
|
79
|
-
return
|
|
114
|
+
return str;
|
|
80
115
|
}
|
|
81
|
-
|
|
82
|
-
|
|
116
|
+
__name(removeSuffix, "removeSuffix");
|
|
117
|
+
function memoEffect(getValue, callback, comparator = (a, b) => a === b) {
|
|
118
|
+
let val;
|
|
119
|
+
let initialized = false;
|
|
120
|
+
let retVal;
|
|
83
121
|
return () => {
|
|
84
|
-
const
|
|
85
|
-
|
|
122
|
+
const next = getValue();
|
|
123
|
+
if (!initialized || !comparator(next, val)) {
|
|
124
|
+
val = next;
|
|
125
|
+
initialized = true;
|
|
126
|
+
retVal = callback(next);
|
|
127
|
+
}
|
|
128
|
+
return retVal;
|
|
86
129
|
};
|
|
87
130
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
131
|
+
__name(memoEffect, "memoEffect");
|
|
132
|
+
function lazy(factory) {
|
|
133
|
+
let instance;
|
|
134
|
+
let initialized = false;
|
|
135
|
+
return () => {
|
|
136
|
+
if (!initialized) {
|
|
137
|
+
instance = factory();
|
|
138
|
+
initialized = true;
|
|
139
|
+
}
|
|
140
|
+
return instance;
|
|
141
|
+
};
|
|
91
142
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
143
|
+
__name(lazy, "lazy");
|
|
144
|
+
function makeNonEnumerable(obj, propertyNames) {
|
|
145
|
+
let propertyDescriptorMap = {};
|
|
146
|
+
for (const propertyName of propertyNames) {
|
|
147
|
+
propertyDescriptorMap[propertyName] = {
|
|
148
|
+
enumerable: false
|
|
97
149
|
};
|
|
98
|
-
|
|
150
|
+
}
|
|
151
|
+
Object.defineProperties(obj, propertyDescriptorMap);
|
|
99
152
|
}
|
|
153
|
+
__name(makeNonEnumerable, "makeNonEnumerable");
|
|
100
154
|
export {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
155
|
+
buildFuncArgCacheKey,
|
|
156
|
+
delay,
|
|
157
|
+
delayError,
|
|
158
|
+
lazy,
|
|
159
|
+
makeNonEnumerable,
|
|
160
|
+
memoEffect,
|
|
161
|
+
normalize,
|
|
162
|
+
removePrefix,
|
|
163
|
+
removeSuffix,
|
|
164
|
+
searchTree,
|
|
165
|
+
suppressConsole,
|
|
166
|
+
withTimeout
|
|
113
167
|
};
|
|
114
168
|
//# sourceMappingURL=utils.es.js.map
|
package/dist/utils.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.es.js","sources":["D:/Src/my/actdim/public/utico/src/utils.ts"],"sourcesContent":null,"names":["normalize","v","buildFuncArgCacheKey","weakMap","args","keys","arg","key","uuid","delay","ms","abortSignal","resolve","reject","id","delayError","errFactory","withTimeout","promise","searchTree","treeNodes","predicate","childSelector","treeNode","node","suppressConsole","action","origConsole","result","removePrefix","str","prefixes","removed","prefix","removeSuffix","suffixes","suffix","memoEffect","getValue","callback","comparator","a","b","val","initialized","retVal","next","lazy","factory","instance","makeNonEnumerable","obj","propertyNames","propertyDescriptorMap","propertyName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.es.js","sources":["D:/Src/my/actdim/public/utico/src/utils.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\r\n\r\n// @filename: util.ts\r\n\r\n// export function guid() {\r\n// function s4() {\r\n// return Math.floor((1 + Math.random()) * 0x10000)\r\n// .toString(16)\r\n// .substring(1);\r\n// }\r\n// return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\r\n// }\r\n\r\nexport const normalize = (v: number) => (!v || !isFinite(v) ? 0 : v);\r\n\r\n// funcArgCacheKeyResolver(Provider/Builder)\r\nexport const buildFuncArgCacheKey = (() => {\r\n const weakMap = new WeakMap<any, string>();\r\n return (...args: any[]) => {\r\n const keys: string[] = [];\r\n for (const arg of args) {\r\n let key: string = undefined;\r\n if (typeof arg === \"number\" || typeof arg === \"string\" || typeof arg === \"boolean\" || arg == undefined) {\r\n key = \"\" + arg;\r\n } else {\r\n key = weakMap.get(arg);\r\n if (!key) {\r\n key = uuid();\r\n weakMap.set(arg, key);\r\n }\r\n }\r\n keys.push(key);\r\n }\r\n return `\"${keys.join(\"/\")}\"`;\r\n };\r\n})();\r\n\r\nexport const delay = (ms: number, abortSignal?: AbortSignal) => {\r\n return new Promise<void>((resolve, reject) => {\r\n if (abortSignal?.aborted) {\r\n reject(abortSignal.reason);\r\n return;\r\n }\r\n const id = setTimeout(resolve, ms);\r\n abortSignal?.addEventListener(\"abort\", () => {\r\n clearTimeout(id);\r\n reject(abortSignal.reason);\r\n }, { once: true });\r\n });\r\n};\r\n\r\n// scheduleError\r\nexport const delayError = async (ms: number, errFactory?: () => Error, abortSignal?: AbortSignal): Promise<never> => {\r\n await delay(ms, abortSignal);\r\n throw errFactory ? errFactory() : new Error(\"Timeout exceeded\");\r\n};\r\n\r\nexport function withTimeout<T>(promise: Promise<T>, ms: number, abortSignal?: AbortSignal): Promise<T> {\r\n return Promise.race([delayError(ms, undefined, abortSignal), promise]);\r\n}\r\n\r\n/**\r\n * Search node in a tree\r\n * @param predicate filter\r\n * @param childSelector\r\n * @param treeNodes\r\n */\r\nexport function searchTree<T>(treeNodes: T[], predicate: (item: T) => boolean, childSelector: (item: T) => T[]) {\r\n if (!treeNodes) {\r\n return undefined;\r\n }\r\n for (const treeNode of treeNodes) {\r\n if (predicate(treeNode)) {\r\n return treeNode;\r\n }\r\n const node = searchTree(childSelector(treeNode), predicate, childSelector);\r\n if (node) {\r\n return node;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const suppressConsole = (action: () => void) => {\r\n const origConsole: any = {};\r\n const result: {\r\n method: keyof Console;\r\n args: any[];\r\n }[] = [];\r\n const keys: (keyof Console)[] = [\"log\" /*, \"debug\", \"warn\", \"info\"*/];\r\n for (const key of keys) {\r\n origConsole[key] = console[key];\r\n console[key] = function (...args: any[]) {\r\n result.push({\r\n method: key,\r\n args: args\r\n });\r\n } as any;\r\n }\r\n try {\r\n action();\r\n } finally {\r\n for (const key of keys) {\r\n console[key] = origConsole[key];\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport function removePrefix(str: string, prefixes: string[]): string {\r\n let removed = true;\r\n while (removed) {\r\n removed = false;\r\n for (const prefix of prefixes) {\r\n if (prefix && str.startsWith(prefix)) {\r\n str = str.slice(prefix.length);\r\n removed = true;\r\n break;\r\n }\r\n }\r\n }\r\n return str;\r\n}\r\n\r\nexport function removeSuffix(str: string, suffixes: string[]): string {\r\n let removed = true;\r\n while (removed) {\r\n removed = false;\r\n for (const suffix of suffixes) {\r\n if (suffix && str.endsWith(suffix)) {\r\n str = str.slice(0, -suffix.length);\r\n removed = true;\r\n break;\r\n }\r\n }\r\n }\r\n return str;\r\n}\r\n\r\n// another comparator example\r\n// const deepEqual = (a: any, b: any) => JSON.stringify(a) === JSON.stringify(b);\r\n// depEffect\r\nexport function memoEffect<TDep, TResult>(\r\n getValue: () => TDep, // getDep\r\n callback: (v: TDep) => TResult, // onChange/action\r\n comparator: (a: TDep, b: TDep) => boolean = (a, b) => a === b // equals\r\n) {\r\n let val: TDep | undefined;\r\n let initialized = false;\r\n let retVal: TResult;\r\n return () => {\r\n const next = getValue();\r\n if (!initialized || !comparator(next, val!)) {\r\n val = next;\r\n initialized = true;\r\n retVal = callback(next);\r\n }\r\n return retVal;\r\n };\r\n}\r\n\r\nexport function lazy<T>(factory: () => T): () => T {\r\n let instance: T | undefined;\r\n let initialized = false;\r\n\r\n return () => {\r\n if (!initialized) {\r\n instance = factory();\r\n initialized = true;\r\n }\r\n return instance!;\r\n };\r\n}\r\n\r\nexport function makeNonEnumerable<T>(obj: T, propertyNames: (keyof T)[]) {\r\n let propertyDescriptorMap: PropertyDescriptorMap = {};\r\n for (const propertyName of propertyNames) {\r\n propertyDescriptorMap[propertyName] = {\r\n enumerable: false\r\n };\r\n }\r\n Object.defineProperties(obj, propertyDescriptorMap);\r\n}\r\n\r\n// TODO:\r\n/*\r\nfunction getMetadata<T>(\r\n store: WeakMap<object, Map<PropertyKey, T>>,\r\n target: object,\r\n prop: PropertyKey,\r\n): T | undefined {\r\n return store.get(target)?.get(prop) as T | undefined;\r\n}\r\n\r\nfunction setMetadata<T>(\r\n store: WeakMap<object, Map<PropertyKey, T>>,\r\n target: object,\r\n prop: PropertyKey,\r\n value: T,\r\n) {\r\n let propMap = store.get(target);\r\n if (!propMap) {\r\n propMap = new Map();\r\n store.set(target, propMap);\r\n }\r\n propMap.set(prop, value);\r\n}\r\n\r\nfunction hasMetadata(\r\n store: WeakMap<object, Map<PropertyKey, any>>,\r\n target: object,\r\n prop: PropertyKey,\r\n): boolean {\r\n return store.get(target)?.has(prop) ?? false;\r\n}\r\n*/\r\n\r\n/*\r\nexport function memoizeThrottle<T extends Func>(\r\n func: T,\r\n wait = 0,\r\n options?: Parameters<typeof _.throttle<T>>[2],\r\n resolver?: Parameters<typeof _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.throttle<T>>>>[1]\r\n) {\r\n const mem = _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.throttle<T>>>(() => {\r\n return _.throttle<T>(func, wait, options);\r\n }, resolver);\r\n\r\n return (...args: Parameters<T>) => {\r\n return mem(...args)(...args);\r\n };\r\n}\r\n\r\nexport function memoizeDebounce<T extends Func>(\r\n func: T,\r\n wait = 0,\r\n options?: Parameters<typeof _.debounce<T>>[2],\r\n resolver?: Parameters<typeof _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.debounce<T>>>>[1]\r\n) {\r\n const mem = _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.debounce<T>>>(() => {\r\n return _.debounce<T>(func, wait, options);\r\n }, resolver);\r\n\r\n return (...args: Parameters<T>) => {\r\n return mem(...args)(...args);\r\n };\r\n}\r\n*/\r\n"],"names":["uuid"],"mappings":"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"}
|
package/dist/watchable.es.js
CHANGED
|
@@ -1,38 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
function watch(fn) {
|
|
4
|
+
let resolve;
|
|
5
|
+
let reject;
|
|
6
|
+
const promise = new Promise((res, rej) => {
|
|
7
|
+
resolve = res;
|
|
8
|
+
reject = rej;
|
|
5
9
|
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
promise.status = "pending";
|
|
11
|
+
Object.defineProperty(promise, "settled", {
|
|
12
|
+
get: /* @__PURE__ */ __name(() => promise.status !== "pending", "get")
|
|
13
|
+
});
|
|
14
|
+
(async () => {
|
|
9
15
|
try {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
const retValue = await Promise.resolve(fn());
|
|
17
|
+
resolve(retValue);
|
|
18
|
+
promise.result = retValue;
|
|
19
|
+
promise.status = "fulfilled";
|
|
20
|
+
} catch (err) {
|
|
21
|
+
reject(err);
|
|
22
|
+
promise.result = void 0;
|
|
23
|
+
promise.status = "rejected";
|
|
14
24
|
}
|
|
15
|
-
})()
|
|
25
|
+
})();
|
|
26
|
+
return promise;
|
|
16
27
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
__name(watch, "watch");
|
|
29
|
+
function toWatchable(fn) {
|
|
30
|
+
let watchable;
|
|
31
|
+
const complete = /* @__PURE__ */ __name((err) => {
|
|
32
|
+
watchable.executing = false;
|
|
33
|
+
if (err) {
|
|
34
|
+
throw err;
|
|
35
|
+
}
|
|
36
|
+
}, "complete");
|
|
37
|
+
watchable = /* @__PURE__ */ __name((...args) => {
|
|
38
|
+
watchable.executing = true;
|
|
39
|
+
let isAsyncFn = false;
|
|
26
40
|
try {
|
|
27
|
-
const
|
|
28
|
-
|
|
41
|
+
const fnResult = fn(...args);
|
|
42
|
+
if (fnResult instanceof Promise) {
|
|
43
|
+
isAsyncFn = true;
|
|
44
|
+
fnResult.catch(complete);
|
|
45
|
+
fnResult.then(complete);
|
|
46
|
+
}
|
|
47
|
+
return fnResult;
|
|
29
48
|
} finally {
|
|
30
|
-
|
|
49
|
+
if (!isAsyncFn) {
|
|
50
|
+
complete();
|
|
51
|
+
}
|
|
31
52
|
}
|
|
32
|
-
},
|
|
53
|
+
}, "watchable");
|
|
54
|
+
return watchable;
|
|
33
55
|
}
|
|
56
|
+
__name(toWatchable, "toWatchable");
|
|
34
57
|
export {
|
|
35
|
-
|
|
36
|
-
|
|
58
|
+
toWatchable,
|
|
59
|
+
watch
|
|
37
60
|
};
|
|
38
61
|
//# sourceMappingURL=watchable.es.js.map
|
package/dist/watchable.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchable.es.js","sources":["D:/Src/my/actdim/public/utico/src/watchable.ts"],"sourcesContent":
|
|
1
|
+
{"version":3,"file":"watchable.es.js","sources":["D:/Src/my/actdim/public/utico/src/watchable.ts"],"sourcesContent":["import { Mutable, Executor, Func } from \"./typeCore\";\r\n\r\n// PromiseState\r\nexport type PromiseStatus = \"pending\" | \"fulfilled\" | \"rejected\";\r\n\r\n// TrackablePromise\r\nexport type WatchablePromise<T = void> = PromiseLike<T> & {\r\n readonly status?: PromiseStatus;\r\n readonly settled?: boolean;\r\n readonly result?: T;\r\n};\r\n\r\n// WatchableFn\r\nexport type WatchableFunc<TArgs extends any[] = any[], T = any> = Func<TArgs, T> & {\r\n executing?: boolean; // running/inProgress/pending\r\n};\r\n\r\n// we need promise wrapper because Promise [[PromiseState]] and [[PromiseResult]] symbols are not accessible\r\n// exec and watch/track\r\nexport function watch<T = void>(fn: Executor<T>) {\r\n // type PromiseExecutorType = ConstructorParameters<typeof Promise<Awaited<T>>>[0];\r\n let resolve!: (value: Awaited<T>) => void;\r\n // let resolve: Parameters<PromiseExecutorType>[0];\r\n let reject!: (reason: any) => void;\r\n // let reject: Parameters<PromiseExecutorType>[1];\r\n\r\n const promise: Mutable<WatchablePromise<Awaited<T>>> = new Promise<Awaited<T>>((res, rej) => {\r\n resolve = res;\r\n reject = rej;\r\n });\r\n\r\n promise.status = \"pending\";\r\n // TODO: create type-safe defineProperty utility method\r\n Object.defineProperty(promise, \"settled\" satisfies keyof typeof promise, {\r\n get: () => promise.status !== \"pending\"\r\n });\r\n\r\n (async () => {\r\n try {\r\n const retValue = (await Promise.resolve(fn())) as Awaited<T>;\r\n resolve(retValue);\r\n promise.result = retValue;\r\n promise.status = \"fulfilled\";\r\n } catch (err) {\r\n reject(err);\r\n promise.result = undefined;\r\n promise.status = \"rejected\";\r\n }\r\n })();\r\n\r\n return promise as WatchablePromise<Awaited<T>>;\r\n}\r\n\r\n// TODO: add Promise.prototype.finally support\r\n\r\n// toTrackable\r\n/** wrap to watchable func */\r\nexport function toWatchable<TArgs extends any[] = any[], T = void>(fn: Func<TArgs, T>): WatchableFunc<TArgs, T> {\r\n // result\r\n let watchable: Func<TArgs, T> & {\r\n executing?: boolean; // running/inProgress/pending\r\n };\r\n const complete = (err?: any) => {\r\n watchable.executing = false;\r\n // watchable result.executing;\r\n if (err) {\r\n // err instanceof Error\r\n throw err; // need to rethrow!\r\n }\r\n };\r\n watchable = (...args) => {\r\n watchable.executing = true;\r\n let isAsyncFn = false;\r\n try {\r\n const fnResult = fn(...args);\r\n if (fnResult instanceof Promise) {\r\n isAsyncFn = true;\r\n fnResult.catch(complete);\r\n fnResult.then(complete);\r\n }\r\n return fnResult;\r\n } finally {\r\n if (!isAsyncFn) {\r\n complete();\r\n }\r\n }\r\n };\r\n return watchable;\r\n}\r\n"],"names":[],"mappings":";;AAmBO,SAAS,MAAgB,IAAiB;AAE7C,MAAI;AAEJ,MAAI;AAGJ,QAAM,UAAiD,IAAI,QAAoB,CAAC,KAAK,QAAQ;AACzF,cAAU;AACV,aAAS;AAAA,EACb,CAAC;AAED,UAAQ,SAAS;AAEjB,SAAO,eAAe,SAAS,WAA0C;AAAA,IACrE,KAAK,6BAAM,QAAQ,WAAW,WAAzB;AAAA,EAAyB,CACjC;AAED,GAAC,YAAY;AACT,QAAI;AACA,YAAM,WAAY,MAAM,QAAQ,QAAQ,IAAI;AAC5C,cAAQ,QAAQ;AAChB,cAAQ,SAAS;AACjB,cAAQ,SAAS;AAAA,IACrB,SAAS,KAAK;AACV,aAAO,GAAG;AACV,cAAQ,SAAS;AACjB,cAAQ,SAAS;AAAA,IACrB;AAAA,EACJ,GAAA;AAEA,SAAO;AACX;AAhCgB;AAsCT,SAAS,YAAmD,IAA6C;AAE5G,MAAI;AAGJ,QAAM,WAAW,wBAAC,QAAc;AAC5B,cAAU,YAAY;AAEtB,QAAI,KAAK;AAEL,YAAM;AAAA,IACV;AAAA,EACJ,GAPiB;AAQjB,cAAY,2BAAI,SAAS;AACrB,cAAU,YAAY;AACtB,QAAI,YAAY;AAChB,QAAI;AACA,YAAM,WAAW,GAAG,GAAG,IAAI;AAC3B,UAAI,oBAAoB,SAAS;AAC7B,oBAAY;AACZ,iBAAS,MAAM,QAAQ;AACvB,iBAAS,KAAK,QAAQ;AAAA,MAC1B;AACA,aAAO;AAAA,IACX,UAAA;AACI,UAAI,CAAC,WAAW;AACZ,iBAAA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAhBY;AAiBZ,SAAO;AACX;AA/BgB;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actdim/utico",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.7",
|
|
4
4
|
"description": "A modern foundation toolkit for complex TypeScript apps",
|
|
5
5
|
"author": "Pavel Borodaev",
|
|
6
6
|
"license": "Proprietary",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"nvm:il": "nvm install lts",
|
|
67
67
|
"format": "prettier --write .",
|
|
68
68
|
"format:check": "prettier --check .",
|
|
69
|
-
"typecheck": "tsc -
|
|
69
|
+
"typecheck": "tsc -b tsconfig.json"
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
|
72
72
|
"dexie": ">=4.2.0",
|