@zajno/common 2.8.0 → 2.8.1
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/cjs/lazy/extensions.js +48 -0
- package/cjs/lazy/extensions.js.map +1 -0
- package/cjs/lazy/lazy.js +27 -12
- package/cjs/lazy/lazy.js.map +1 -1
- package/cjs/lazy/light.js +11 -1
- package/cjs/lazy/light.js.map +1 -1
- package/cjs/lazy/promise.js +119 -8
- package/cjs/lazy/promise.js.map +1 -1
- package/cjs/lazy/types.js +0 -2
- package/cjs/lazy/types.js.map +1 -1
- package/cjs/structures/extendObject.js +8 -0
- package/cjs/structures/extendObject.js.map +1 -0
- package/esm/lazy/extensions.js +45 -0
- package/esm/lazy/extensions.js.map +1 -0
- package/esm/lazy/lazy.js +27 -12
- package/esm/lazy/lazy.js.map +1 -1
- package/esm/lazy/light.js +11 -1
- package/esm/lazy/light.js.map +1 -1
- package/esm/lazy/promise.js +119 -8
- package/esm/lazy/promise.js.map +1 -1
- package/esm/lazy/types.js +0 -2
- package/esm/lazy/types.js.map +1 -1
- package/esm/structures/extendObject.js +5 -0
- package/esm/structures/extendObject.js.map +1 -0
- package/package.json +1 -1
- package/tsconfig.cjs.tsbuildinfo +1 -1
- package/tsconfig.esm.tsbuildinfo +1 -1
- package/tsconfig.types.tsbuildinfo +1 -1
- package/types/lazy/extensions.d.ts +10 -0
- package/types/lazy/lazy.d.ts +5 -2
- package/types/lazy/promise.d.ts +59 -8
- package/types/lazy/types.d.ts +99 -5
- package/types/structures/extendObject.d.ts +13 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCacheExtension = createCacheExtension;
|
|
4
|
+
const extendObject_js_1 = require("../structures/extendObject.js");
|
|
5
|
+
function createCacheExtension(storage) {
|
|
6
|
+
return {
|
|
7
|
+
overrideFactory: (original) => {
|
|
8
|
+
return async (refreshing) => {
|
|
9
|
+
if (!refreshing) {
|
|
10
|
+
// read cached value first
|
|
11
|
+
const cached = await storage.getValue();
|
|
12
|
+
if (cached != null) {
|
|
13
|
+
return cached;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const value = await original(refreshing);
|
|
17
|
+
// cache the fresh result
|
|
18
|
+
storage.setValue(value);
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
extendShape: (previous) => {
|
|
23
|
+
return (0, extendObject_js_1.extendObject)(previous, {
|
|
24
|
+
cache: {
|
|
25
|
+
get: () => storage,
|
|
26
|
+
},
|
|
27
|
+
resetWithCache: {
|
|
28
|
+
value: () => {
|
|
29
|
+
storage.removeValue();
|
|
30
|
+
previous.reset();
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
setCachedInstance: {
|
|
34
|
+
value: (value) => {
|
|
35
|
+
if (value == null) {
|
|
36
|
+
storage.removeValue();
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
storage.setValue(value);
|
|
40
|
+
}
|
|
41
|
+
return previous.setInstance(value);
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../src/lazy/extensions.ts"],"names":[],"mappings":";;AAcA,oDAoDC;AAjED,mEAA6D;AAa7D,SAAgB,oBAAoB,CAA8D,OAAiB;IAC/G,OAAO;QACH,eAAe,EAAE,CACb,QAA8C,EACR,EAAE;YACxC,OAAO,KAAK,EAAE,UAAoB,EAAc,EAAE;gBAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;oBACd,0BAA0B;oBAC1B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACxC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;wBACjB,OAAO,MAAM,CAAC;oBAClB,CAAC;gBACL,CAAC;gBAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAEzC,yBAAyB;gBACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAExB,OAAO,KAAK,CAAC;YACjB,CAAC,CAAC;QACN,CAAC;QACD,WAAW,EAAE,CACT,QAA+C,EACjD,EAAE;YACA,OAAO,IAAA,8BAAY,EACf,QAAQ,EACR;gBACI,KAAK,EAAE;oBACH,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;iBACrB;gBACD,cAAc,EAAE;oBACZ,KAAK,EAAE,GAAG,EAAE;wBACR,OAAO,CAAC,WAAW,EAAE,CAAC;wBACtB,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACrB,CAAC;iBACJ;gBACD,iBAAiB,EAAE;oBACf,KAAK,EAAE,CAAC,KAAQ,EAAE,EAAE;wBAChB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;4BAChB,OAAO,CAAC,WAAW,EAAE,CAAC;wBAC1B,CAAC;6BAAM,CAAC;4BACJ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;wBAC5B,CAAC;wBAED,OAAO,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBACvC,CAAC;iBACJ;aACJ,CACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC"}
|
package/cjs/lazy/lazy.js
CHANGED
|
@@ -7,6 +7,7 @@ class Lazy {
|
|
|
7
7
|
_instance = undefined;
|
|
8
8
|
_expireTracker;
|
|
9
9
|
_disposer;
|
|
10
|
+
_error = null;
|
|
10
11
|
constructor(_factory) {
|
|
11
12
|
this._factory = _factory;
|
|
12
13
|
}
|
|
@@ -15,9 +16,8 @@ class Lazy {
|
|
|
15
16
|
this.ensureInstance();
|
|
16
17
|
return this._instance;
|
|
17
18
|
}
|
|
18
|
-
get currentValue() {
|
|
19
|
-
|
|
20
|
-
}
|
|
19
|
+
get currentValue() { return this._instance; }
|
|
20
|
+
get error() { return this._error; }
|
|
21
21
|
/** Override me: additional way to make sure instance is valid */
|
|
22
22
|
get isValid() {
|
|
23
23
|
if (!this.hasValue) {
|
|
@@ -39,15 +39,6 @@ class Lazy {
|
|
|
39
39
|
this._expireTracker = tracker;
|
|
40
40
|
return this;
|
|
41
41
|
}
|
|
42
|
-
ensureInstance() {
|
|
43
|
-
if (this.isValid) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
// additional reset to make sure previous instance has been disposed
|
|
47
|
-
this.reset();
|
|
48
|
-
const res = this._factory();
|
|
49
|
-
this.setInstance(res);
|
|
50
|
-
}
|
|
51
42
|
prewarm() {
|
|
52
43
|
this.ensureInstance();
|
|
53
44
|
return this;
|
|
@@ -68,8 +59,32 @@ class Lazy {
|
|
|
68
59
|
}
|
|
69
60
|
}
|
|
70
61
|
this.setInstance(undefined);
|
|
62
|
+
this._error = null;
|
|
71
63
|
}
|
|
72
64
|
dispose() { this.reset(); }
|
|
65
|
+
ensureInstance() {
|
|
66
|
+
if (this.isValid) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// additional reset to make sure previous instance has been disposed
|
|
70
|
+
this.reset();
|
|
71
|
+
try {
|
|
72
|
+
const res = this._factory();
|
|
73
|
+
this.setInstance(res);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
this._error = this.parseError(e);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
parseError(err) {
|
|
80
|
+
if (typeof err === 'string') {
|
|
81
|
+
return err;
|
|
82
|
+
}
|
|
83
|
+
if (err instanceof Error) {
|
|
84
|
+
return err.message;
|
|
85
|
+
}
|
|
86
|
+
return String(err) || 'Unknown error';
|
|
87
|
+
}
|
|
73
88
|
}
|
|
74
89
|
exports.Lazy = Lazy;
|
|
75
90
|
//# sourceMappingURL=lazy.js.map
|
package/cjs/lazy/lazy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../../src/lazy/lazy.ts"],"names":[],"mappings":";;;AAAA,0DAAwE;AAKxE,MAAa,IAAI;
|
|
1
|
+
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../../src/lazy/lazy.ts"],"names":[],"mappings":"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"}
|
package/cjs/lazy/light.js
CHANGED
|
@@ -4,17 +4,27 @@ exports.createLazy = createLazy;
|
|
|
4
4
|
function createLazy(factory) {
|
|
5
5
|
const _factory = factory;
|
|
6
6
|
let _instance = undefined;
|
|
7
|
+
let _error = null;
|
|
7
8
|
const res = {
|
|
8
9
|
get value() {
|
|
9
10
|
if (_instance === undefined) {
|
|
10
|
-
|
|
11
|
+
_error = null;
|
|
12
|
+
try {
|
|
13
|
+
_instance = _factory();
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
_error = e instanceof Error ? e.message : String(e);
|
|
17
|
+
throw e;
|
|
18
|
+
}
|
|
11
19
|
}
|
|
12
20
|
return _instance;
|
|
13
21
|
},
|
|
14
22
|
get currentValue() { return _instance; },
|
|
15
23
|
get hasValue() { return _instance !== undefined; },
|
|
24
|
+
get error() { return _error; },
|
|
16
25
|
reset: () => {
|
|
17
26
|
_instance = undefined;
|
|
27
|
+
_error = null;
|
|
18
28
|
},
|
|
19
29
|
dispose: () => res.reset(),
|
|
20
30
|
};
|
package/cjs/lazy/light.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"light.js","sourceRoot":"","sources":["../../../src/lazy/light.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"light.js","sourceRoot":"","sources":["../../../src/lazy/light.ts"],"names":[],"mappings":";;AAIA,gCA6BC;AA7BD,SAAgB,UAAU,CAAI,OAAgB;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAI,SAAS,GAAkB,SAAS,CAAC;IACzC,IAAI,MAAM,GAAkB,IAAI,CAAC;IAEjC,MAAM,GAAG,GAA8C;QACnD,IAAI,KAAK;YACL,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,CAAC;oBACD,SAAS,GAAG,QAAQ,EAAE,CAAC;gBAC3B,CAAC;gBAAC,OAAO,CAAU,EAAE,CAAC;oBAClB,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACpD,MAAM,CAAC,CAAC;gBACZ,CAAC;YACL,CAAC;YACD,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,YAAY,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;QAC9B,KAAK,EAAE,GAAG,EAAE;YACR,SAAS,GAAG,SAAS,CAAC;YACtB,MAAM,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;KAC7B,CAAC;IAEF,OAAO,GAAG,CAAC;AACf,CAAC"}
|
package/cjs/lazy/promise.js
CHANGED
|
@@ -4,18 +4,21 @@ exports.LazyPromise = void 0;
|
|
|
4
4
|
const disposer_js_1 = require("../functions/disposer.js");
|
|
5
5
|
class LazyPromise {
|
|
6
6
|
_factory;
|
|
7
|
-
|
|
8
|
-
_instance
|
|
7
|
+
_initial;
|
|
8
|
+
_instance;
|
|
9
9
|
_isLoading = null;
|
|
10
10
|
_promise;
|
|
11
11
|
_expireTracker;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
this.
|
|
12
|
+
_lastRefreshingPromise = null;
|
|
13
|
+
_error = null;
|
|
14
|
+
constructor(factory, initial) {
|
|
15
|
+
this._factory = factory;
|
|
16
|
+
this._initial = initial;
|
|
17
|
+
this._instance = initial; // as ILazyValue<T, TInitial>;
|
|
16
18
|
}
|
|
17
19
|
get isLoading() { return this._isLoading; }
|
|
18
20
|
get hasValue() { return this._isLoading === false; }
|
|
21
|
+
get error() { return this._error; }
|
|
19
22
|
get promise() {
|
|
20
23
|
this.ensureInstanceLoading();
|
|
21
24
|
return this._promise;
|
|
@@ -32,6 +35,61 @@ class LazyPromise {
|
|
|
32
35
|
this._expireTracker = tracker;
|
|
33
36
|
return this;
|
|
34
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Extends this instance with additional functionality by applying extensions in place.
|
|
40
|
+
*
|
|
41
|
+
* **Capabilities:**
|
|
42
|
+
* - `overrideFactory`: Wrap the factory function (logging, retry, caching, etc.)
|
|
43
|
+
* - `extendShape`: Add custom properties/methods to the instance
|
|
44
|
+
*
|
|
45
|
+
* **Type Safety:**
|
|
46
|
+
* - Use `ILazyPromiseExtension<any>` for universal extensions
|
|
47
|
+
* - Use `ILazyPromiseExtension<ConcreteType>` for type-specific extensions (e.g., number-only)
|
|
48
|
+
*
|
|
49
|
+
* **Note:** Extensions mutate the instance and can be chained. Subclasses preserve their type.
|
|
50
|
+
*
|
|
51
|
+
* @param extension - Configuration with factory override and/or shape extensions
|
|
52
|
+
* @returns The same instance (this) with applied extensions
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* // Universal logging extension
|
|
57
|
+
* const logged = lazy.extend({
|
|
58
|
+
* overrideFactory: (factory) => async (refreshing) => {
|
|
59
|
+
* console.log('Loading...');
|
|
60
|
+
* return await factory(refreshing);
|
|
61
|
+
* }
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* // Type-specific extension with custom methods
|
|
65
|
+
* const enhanced = lazyNumber.extend<{ double: () => number | undefined }>({
|
|
66
|
+
* extendShape: (instance) => Object.assign(instance, {
|
|
67
|
+
* double: () => instance.currentValue !== undefined
|
|
68
|
+
* ? instance.currentValue * 2
|
|
69
|
+
* : undefined
|
|
70
|
+
* })
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* // Chaining multiple extensions
|
|
74
|
+
* const composed = lazy
|
|
75
|
+
* .extend(cacheExtension)
|
|
76
|
+
* .extend(loggingExtension);
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
extend(
|
|
80
|
+
// Partial allows extensions with extra properties beyond the interface
|
|
81
|
+
// 'any' type parameter doesn't affect return type since we return 'this'
|
|
82
|
+
extension) {
|
|
83
|
+
// Override the factory if provided
|
|
84
|
+
if (extension.overrideFactory) {
|
|
85
|
+
this._factory = extension.overrideFactory(this._factory, this);
|
|
86
|
+
}
|
|
87
|
+
// Apply shape extension if provided
|
|
88
|
+
if (extension.extendShape) {
|
|
89
|
+
return extension.extendShape(this);
|
|
90
|
+
}
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
35
93
|
ensureInstanceLoading() {
|
|
36
94
|
if (this.isLoading === false && this._instance !== undefined && this._expireTracker?.isExpired) {
|
|
37
95
|
// do not reset the instance, just make sure it will be reloaded
|
|
@@ -39,9 +97,14 @@ class LazyPromise {
|
|
|
39
97
|
}
|
|
40
98
|
if (this._isLoading === null) {
|
|
41
99
|
this._isLoading = true;
|
|
42
|
-
this.
|
|
100
|
+
this.doLoad();
|
|
43
101
|
}
|
|
44
102
|
}
|
|
103
|
+
doLoad() {
|
|
104
|
+
this._promise = this._factory(false)
|
|
105
|
+
.then(this.onResolved.bind(this))
|
|
106
|
+
.catch(this.onRejected.bind(this));
|
|
107
|
+
}
|
|
45
108
|
onResolved(res) {
|
|
46
109
|
// case: during the promise `setInstance` was called
|
|
47
110
|
if (!this._isLoading && this._instance !== undefined) {
|
|
@@ -50,8 +113,16 @@ class LazyPromise {
|
|
|
50
113
|
this.setInstance(res);
|
|
51
114
|
return res;
|
|
52
115
|
}
|
|
116
|
+
onRejected(e) {
|
|
117
|
+
this._isLoading = false;
|
|
118
|
+
this._instance = this._initial;
|
|
119
|
+
this._promise = Promise.resolve(this._initial);
|
|
120
|
+
this.setError(e);
|
|
121
|
+
return this._initial;
|
|
122
|
+
}
|
|
53
123
|
setInstance(res) {
|
|
54
124
|
this._isLoading = false;
|
|
125
|
+
this.clearError(); // clear error on successful set
|
|
55
126
|
// refresh promise so it won't keep old callbacks
|
|
56
127
|
// + make sure it's resolved with the freshest value
|
|
57
128
|
// also do this before setting the instance... just in case :)
|
|
@@ -62,10 +133,41 @@ class LazyPromise {
|
|
|
62
133
|
}
|
|
63
134
|
return res;
|
|
64
135
|
}
|
|
136
|
+
setError(err) {
|
|
137
|
+
this._error = this.parseError(err);
|
|
138
|
+
}
|
|
139
|
+
clearError() {
|
|
140
|
+
this._error = null;
|
|
141
|
+
}
|
|
142
|
+
async refresh() {
|
|
143
|
+
let myPromise = null;
|
|
144
|
+
try {
|
|
145
|
+
myPromise = this._factory(true);
|
|
146
|
+
// every new refresh overrides the previous one
|
|
147
|
+
// so this one becomes "last"
|
|
148
|
+
// and previous becomes stale and won't update the value when it resolves
|
|
149
|
+
this._lastRefreshingPromise = myPromise;
|
|
150
|
+
const fresh = await myPromise;
|
|
151
|
+
if (this._lastRefreshingPromise === myPromise) {
|
|
152
|
+
this.setInstance(fresh);
|
|
153
|
+
}
|
|
154
|
+
return fresh;
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
this.setError(e);
|
|
158
|
+
return this._instance;
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
if (myPromise != null && this._lastRefreshingPromise === myPromise) {
|
|
162
|
+
this._lastRefreshingPromise = null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
65
166
|
reset() {
|
|
66
167
|
this._isLoading = null;
|
|
168
|
+
this.clearError();
|
|
67
169
|
const wasDisposed = (0, disposer_js_1.tryDispose)(this._instance);
|
|
68
|
-
this._instance = this.
|
|
170
|
+
this._instance = this._initial;
|
|
69
171
|
const p = this._promise;
|
|
70
172
|
this._promise = undefined;
|
|
71
173
|
// check if loading is still in progress
|
|
@@ -79,6 +181,15 @@ class LazyPromise {
|
|
|
79
181
|
dispose() {
|
|
80
182
|
this.reset();
|
|
81
183
|
}
|
|
184
|
+
parseError(err) {
|
|
185
|
+
if (typeof err === 'string') {
|
|
186
|
+
return err;
|
|
187
|
+
}
|
|
188
|
+
if (err instanceof Error) {
|
|
189
|
+
return err.message;
|
|
190
|
+
}
|
|
191
|
+
return String(err) || 'Unknown error';
|
|
192
|
+
}
|
|
82
193
|
}
|
|
83
194
|
exports.LazyPromise = LazyPromise;
|
|
84
195
|
//# sourceMappingURL=promise.js.map
|
package/cjs/lazy/promise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../../src/lazy/promise.ts"],"names":[],"mappings":";;;AAAA,0DAAwE;AAKxE,MAAa,WAAW;
|
|
1
|
+
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../../src/lazy/promise.ts"],"names":[],"mappings":"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"}
|
package/cjs/lazy/types.js
CHANGED
package/cjs/lazy/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lazy/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lazy/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extendObject = extendObject;
|
|
4
|
+
/** Type-safe version of `Object.defineProperties` */
|
|
5
|
+
function extendObject(base, extensionDescriptorsMap) {
|
|
6
|
+
return Object.defineProperties(base, extensionDescriptorsMap);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=extendObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extendObject.js","sourceRoot":"","sources":["../../../src/structures/extendObject.ts"],"names":[],"mappings":";;AAeA,oCAKC;AAND,qDAAqD;AACrD,SAAgB,YAAY,CAC1B,IAAO,EACP,uBAAiD;IAEjD,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,CAAmB,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { extendObject } from '../structures/extendObject.js';
|
|
2
|
+
export function createCacheExtension(storage) {
|
|
3
|
+
return {
|
|
4
|
+
overrideFactory: (original) => {
|
|
5
|
+
return async (refreshing) => {
|
|
6
|
+
if (!refreshing) {
|
|
7
|
+
// read cached value first
|
|
8
|
+
const cached = await storage.getValue();
|
|
9
|
+
if (cached != null) {
|
|
10
|
+
return cached;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const value = await original(refreshing);
|
|
14
|
+
// cache the fresh result
|
|
15
|
+
storage.setValue(value);
|
|
16
|
+
return value;
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
extendShape: (previous) => {
|
|
20
|
+
return extendObject(previous, {
|
|
21
|
+
cache: {
|
|
22
|
+
get: () => storage,
|
|
23
|
+
},
|
|
24
|
+
resetWithCache: {
|
|
25
|
+
value: () => {
|
|
26
|
+
storage.removeValue();
|
|
27
|
+
previous.reset();
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
setCachedInstance: {
|
|
31
|
+
value: (value) => {
|
|
32
|
+
if (value == null) {
|
|
33
|
+
storage.removeValue();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
storage.setValue(value);
|
|
37
|
+
}
|
|
38
|
+
return previous.setInstance(value);
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../src/lazy/extensions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAa7D,MAAM,UAAU,oBAAoB,CAA8D,OAAiB;IAC/G,OAAO;QACH,eAAe,EAAE,CACb,QAA8C,EACR,EAAE;YACxC,OAAO,KAAK,EAAE,UAAoB,EAAc,EAAE;gBAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;oBACd,0BAA0B;oBAC1B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACxC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;wBACjB,OAAO,MAAM,CAAC;oBAClB,CAAC;gBACL,CAAC;gBAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAEzC,yBAAyB;gBACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAExB,OAAO,KAAK,CAAC;YACjB,CAAC,CAAC;QACN,CAAC;QACD,WAAW,EAAE,CACT,QAA+C,EACjD,EAAE;YACA,OAAO,YAAY,CACf,QAAQ,EACR;gBACI,KAAK,EAAE;oBACH,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;iBACrB;gBACD,cAAc,EAAE;oBACZ,KAAK,EAAE,GAAG,EAAE;wBACR,OAAO,CAAC,WAAW,EAAE,CAAC;wBACtB,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACrB,CAAC;iBACJ;gBACD,iBAAiB,EAAE;oBACf,KAAK,EAAE,CAAC,KAAQ,EAAE,EAAE;wBAChB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;4BAChB,OAAO,CAAC,WAAW,EAAE,CAAC;wBAC1B,CAAC;6BAAM,CAAC;4BACJ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;wBAC5B,CAAC;wBAED,OAAO,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBACvC,CAAC;iBACJ;aACJ,CACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC"}
|
package/esm/lazy/lazy.js
CHANGED
|
@@ -4,6 +4,7 @@ export class Lazy {
|
|
|
4
4
|
_instance = undefined;
|
|
5
5
|
_expireTracker;
|
|
6
6
|
_disposer;
|
|
7
|
+
_error = null;
|
|
7
8
|
constructor(_factory) {
|
|
8
9
|
this._factory = _factory;
|
|
9
10
|
}
|
|
@@ -12,9 +13,8 @@ export class Lazy {
|
|
|
12
13
|
this.ensureInstance();
|
|
13
14
|
return this._instance;
|
|
14
15
|
}
|
|
15
|
-
get currentValue() {
|
|
16
|
-
|
|
17
|
-
}
|
|
16
|
+
get currentValue() { return this._instance; }
|
|
17
|
+
get error() { return this._error; }
|
|
18
18
|
/** Override me: additional way to make sure instance is valid */
|
|
19
19
|
get isValid() {
|
|
20
20
|
if (!this.hasValue) {
|
|
@@ -36,15 +36,6 @@ export class Lazy {
|
|
|
36
36
|
this._expireTracker = tracker;
|
|
37
37
|
return this;
|
|
38
38
|
}
|
|
39
|
-
ensureInstance() {
|
|
40
|
-
if (this.isValid) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
// additional reset to make sure previous instance has been disposed
|
|
44
|
-
this.reset();
|
|
45
|
-
const res = this._factory();
|
|
46
|
-
this.setInstance(res);
|
|
47
|
-
}
|
|
48
39
|
prewarm() {
|
|
49
40
|
this.ensureInstance();
|
|
50
41
|
return this;
|
|
@@ -65,7 +56,31 @@ export class Lazy {
|
|
|
65
56
|
}
|
|
66
57
|
}
|
|
67
58
|
this.setInstance(undefined);
|
|
59
|
+
this._error = null;
|
|
68
60
|
}
|
|
69
61
|
dispose() { this.reset(); }
|
|
62
|
+
ensureInstance() {
|
|
63
|
+
if (this.isValid) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// additional reset to make sure previous instance has been disposed
|
|
67
|
+
this.reset();
|
|
68
|
+
try {
|
|
69
|
+
const res = this._factory();
|
|
70
|
+
this.setInstance(res);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
this._error = this.parseError(e);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
parseError(err) {
|
|
77
|
+
if (typeof err === 'string') {
|
|
78
|
+
return err;
|
|
79
|
+
}
|
|
80
|
+
if (err instanceof Error) {
|
|
81
|
+
return err.message;
|
|
82
|
+
}
|
|
83
|
+
return String(err) || 'Unknown error';
|
|
84
|
+
}
|
|
70
85
|
}
|
|
71
86
|
//# sourceMappingURL=lazy.js.map
|
package/esm/lazy/lazy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../../src/lazy/lazy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAC;AAKxE,MAAM,OAAO,IAAI;
|
|
1
|
+
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../../src/lazy/lazy.ts"],"names":[],"mappings":"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"}
|
package/esm/lazy/light.js
CHANGED
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
export function createLazy(factory) {
|
|
2
2
|
const _factory = factory;
|
|
3
3
|
let _instance = undefined;
|
|
4
|
+
let _error = null;
|
|
4
5
|
const res = {
|
|
5
6
|
get value() {
|
|
6
7
|
if (_instance === undefined) {
|
|
7
|
-
|
|
8
|
+
_error = null;
|
|
9
|
+
try {
|
|
10
|
+
_instance = _factory();
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
_error = e instanceof Error ? e.message : String(e);
|
|
14
|
+
throw e;
|
|
15
|
+
}
|
|
8
16
|
}
|
|
9
17
|
return _instance;
|
|
10
18
|
},
|
|
11
19
|
get currentValue() { return _instance; },
|
|
12
20
|
get hasValue() { return _instance !== undefined; },
|
|
21
|
+
get error() { return _error; },
|
|
13
22
|
reset: () => {
|
|
14
23
|
_instance = undefined;
|
|
24
|
+
_error = null;
|
|
15
25
|
},
|
|
16
26
|
dispose: () => res.reset(),
|
|
17
27
|
};
|
package/esm/lazy/light.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"light.js","sourceRoot":"","sources":["../../../src/lazy/light.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,UAAU,CAAI,OAAgB;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAI,SAAS,GAAkB,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"light.js","sourceRoot":"","sources":["../../../src/lazy/light.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,UAAU,CAAI,OAAgB;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAI,SAAS,GAAkB,SAAS,CAAC;IACzC,IAAI,MAAM,GAAkB,IAAI,CAAC;IAEjC,MAAM,GAAG,GAA8C;QACnD,IAAI,KAAK;YACL,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,CAAC;oBACD,SAAS,GAAG,QAAQ,EAAE,CAAC;gBAC3B,CAAC;gBAAC,OAAO,CAAU,EAAE,CAAC;oBAClB,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACpD,MAAM,CAAC,CAAC;gBACZ,CAAC;YACL,CAAC;YACD,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,YAAY,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;QAC9B,KAAK,EAAE,GAAG,EAAE;YACR,SAAS,GAAG,SAAS,CAAC;YACtB,MAAM,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;KAC7B,CAAC;IAEF,OAAO,GAAG,CAAC;AACf,CAAC"}
|
package/esm/lazy/promise.js
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { tryDispose } from '../functions/disposer.js';
|
|
2
2
|
export class LazyPromise {
|
|
3
3
|
_factory;
|
|
4
|
-
|
|
5
|
-
_instance
|
|
4
|
+
_initial;
|
|
5
|
+
_instance;
|
|
6
6
|
_isLoading = null;
|
|
7
7
|
_promise;
|
|
8
8
|
_expireTracker;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
this.
|
|
9
|
+
_lastRefreshingPromise = null;
|
|
10
|
+
_error = null;
|
|
11
|
+
constructor(factory, initial) {
|
|
12
|
+
this._factory = factory;
|
|
13
|
+
this._initial = initial;
|
|
14
|
+
this._instance = initial; // as ILazyValue<T, TInitial>;
|
|
13
15
|
}
|
|
14
16
|
get isLoading() { return this._isLoading; }
|
|
15
17
|
get hasValue() { return this._isLoading === false; }
|
|
18
|
+
get error() { return this._error; }
|
|
16
19
|
get promise() {
|
|
17
20
|
this.ensureInstanceLoading();
|
|
18
21
|
return this._promise;
|
|
@@ -29,6 +32,61 @@ export class LazyPromise {
|
|
|
29
32
|
this._expireTracker = tracker;
|
|
30
33
|
return this;
|
|
31
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Extends this instance with additional functionality by applying extensions in place.
|
|
37
|
+
*
|
|
38
|
+
* **Capabilities:**
|
|
39
|
+
* - `overrideFactory`: Wrap the factory function (logging, retry, caching, etc.)
|
|
40
|
+
* - `extendShape`: Add custom properties/methods to the instance
|
|
41
|
+
*
|
|
42
|
+
* **Type Safety:**
|
|
43
|
+
* - Use `ILazyPromiseExtension<any>` for universal extensions
|
|
44
|
+
* - Use `ILazyPromiseExtension<ConcreteType>` for type-specific extensions (e.g., number-only)
|
|
45
|
+
*
|
|
46
|
+
* **Note:** Extensions mutate the instance and can be chained. Subclasses preserve their type.
|
|
47
|
+
*
|
|
48
|
+
* @param extension - Configuration with factory override and/or shape extensions
|
|
49
|
+
* @returns The same instance (this) with applied extensions
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* // Universal logging extension
|
|
54
|
+
* const logged = lazy.extend({
|
|
55
|
+
* overrideFactory: (factory) => async (refreshing) => {
|
|
56
|
+
* console.log('Loading...');
|
|
57
|
+
* return await factory(refreshing);
|
|
58
|
+
* }
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* // Type-specific extension with custom methods
|
|
62
|
+
* const enhanced = lazyNumber.extend<{ double: () => number | undefined }>({
|
|
63
|
+
* extendShape: (instance) => Object.assign(instance, {
|
|
64
|
+
* double: () => instance.currentValue !== undefined
|
|
65
|
+
* ? instance.currentValue * 2
|
|
66
|
+
* : undefined
|
|
67
|
+
* })
|
|
68
|
+
* });
|
|
69
|
+
*
|
|
70
|
+
* // Chaining multiple extensions
|
|
71
|
+
* const composed = lazy
|
|
72
|
+
* .extend(cacheExtension)
|
|
73
|
+
* .extend(loggingExtension);
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
extend(
|
|
77
|
+
// Partial allows extensions with extra properties beyond the interface
|
|
78
|
+
// 'any' type parameter doesn't affect return type since we return 'this'
|
|
79
|
+
extension) {
|
|
80
|
+
// Override the factory if provided
|
|
81
|
+
if (extension.overrideFactory) {
|
|
82
|
+
this._factory = extension.overrideFactory(this._factory, this);
|
|
83
|
+
}
|
|
84
|
+
// Apply shape extension if provided
|
|
85
|
+
if (extension.extendShape) {
|
|
86
|
+
return extension.extendShape(this);
|
|
87
|
+
}
|
|
88
|
+
return this;
|
|
89
|
+
}
|
|
32
90
|
ensureInstanceLoading() {
|
|
33
91
|
if (this.isLoading === false && this._instance !== undefined && this._expireTracker?.isExpired) {
|
|
34
92
|
// do not reset the instance, just make sure it will be reloaded
|
|
@@ -36,9 +94,14 @@ export class LazyPromise {
|
|
|
36
94
|
}
|
|
37
95
|
if (this._isLoading === null) {
|
|
38
96
|
this._isLoading = true;
|
|
39
|
-
this.
|
|
97
|
+
this.doLoad();
|
|
40
98
|
}
|
|
41
99
|
}
|
|
100
|
+
doLoad() {
|
|
101
|
+
this._promise = this._factory(false)
|
|
102
|
+
.then(this.onResolved.bind(this))
|
|
103
|
+
.catch(this.onRejected.bind(this));
|
|
104
|
+
}
|
|
42
105
|
onResolved(res) {
|
|
43
106
|
// case: during the promise `setInstance` was called
|
|
44
107
|
if (!this._isLoading && this._instance !== undefined) {
|
|
@@ -47,8 +110,16 @@ export class LazyPromise {
|
|
|
47
110
|
this.setInstance(res);
|
|
48
111
|
return res;
|
|
49
112
|
}
|
|
113
|
+
onRejected(e) {
|
|
114
|
+
this._isLoading = false;
|
|
115
|
+
this._instance = this._initial;
|
|
116
|
+
this._promise = Promise.resolve(this._initial);
|
|
117
|
+
this.setError(e);
|
|
118
|
+
return this._initial;
|
|
119
|
+
}
|
|
50
120
|
setInstance(res) {
|
|
51
121
|
this._isLoading = false;
|
|
122
|
+
this.clearError(); // clear error on successful set
|
|
52
123
|
// refresh promise so it won't keep old callbacks
|
|
53
124
|
// + make sure it's resolved with the freshest value
|
|
54
125
|
// also do this before setting the instance... just in case :)
|
|
@@ -59,10 +130,41 @@ export class LazyPromise {
|
|
|
59
130
|
}
|
|
60
131
|
return res;
|
|
61
132
|
}
|
|
133
|
+
setError(err) {
|
|
134
|
+
this._error = this.parseError(err);
|
|
135
|
+
}
|
|
136
|
+
clearError() {
|
|
137
|
+
this._error = null;
|
|
138
|
+
}
|
|
139
|
+
async refresh() {
|
|
140
|
+
let myPromise = null;
|
|
141
|
+
try {
|
|
142
|
+
myPromise = this._factory(true);
|
|
143
|
+
// every new refresh overrides the previous one
|
|
144
|
+
// so this one becomes "last"
|
|
145
|
+
// and previous becomes stale and won't update the value when it resolves
|
|
146
|
+
this._lastRefreshingPromise = myPromise;
|
|
147
|
+
const fresh = await myPromise;
|
|
148
|
+
if (this._lastRefreshingPromise === myPromise) {
|
|
149
|
+
this.setInstance(fresh);
|
|
150
|
+
}
|
|
151
|
+
return fresh;
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
this.setError(e);
|
|
155
|
+
return this._instance;
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
if (myPromise != null && this._lastRefreshingPromise === myPromise) {
|
|
159
|
+
this._lastRefreshingPromise = null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
62
163
|
reset() {
|
|
63
164
|
this._isLoading = null;
|
|
165
|
+
this.clearError();
|
|
64
166
|
const wasDisposed = tryDispose(this._instance);
|
|
65
|
-
this._instance = this.
|
|
167
|
+
this._instance = this._initial;
|
|
66
168
|
const p = this._promise;
|
|
67
169
|
this._promise = undefined;
|
|
68
170
|
// check if loading is still in progress
|
|
@@ -76,5 +178,14 @@ export class LazyPromise {
|
|
|
76
178
|
dispose() {
|
|
77
179
|
this.reset();
|
|
78
180
|
}
|
|
181
|
+
parseError(err) {
|
|
182
|
+
if (typeof err === 'string') {
|
|
183
|
+
return err;
|
|
184
|
+
}
|
|
185
|
+
if (err instanceof Error) {
|
|
186
|
+
return err.message;
|
|
187
|
+
}
|
|
188
|
+
return String(err) || 'Unknown error';
|
|
189
|
+
}
|
|
79
190
|
}
|
|
80
191
|
//# sourceMappingURL=promise.js.map
|
package/esm/lazy/promise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../../src/lazy/promise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAC;AAKxE,MAAM,OAAO,WAAW;
|
|
1
|
+
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../../src/lazy/promise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAC;AAKxE,MAAM,OAAO,WAAW;IAEZ,QAAQ,CAAiB;IAChB,QAAQ,CAAW;IAE5B,SAAS,CAAe;IACxB,UAAU,GAAmB,IAAI,CAAC;IAElC,QAAQ,CAAyB;IACjC,cAAc,CAA6B;IAE3C,sBAAsB,GAAsB,IAAI,CAAC;IACjD,MAAM,GAAkB,IAAI,CAAC;IAErC,YACI,OAAuB,EACvB,OAAkB;QAElB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,OAAmB,CAAC;QAEpC,IAAI,CAAC,SAAS,GAAG,OAAuB,CAAC,CAAC,8BAA8B;IAC5E,CAAC;IAED,IAAW,SAAS,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAClD,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC;IAC3D,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAE1C,IAAW,OAAO;QACd,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAS,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK;QACL,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,6BAA6B;IAC7B,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAEM,UAAU,CAAC,OAAmC;QACjD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;IACI,MAAM;IACT,uEAAuE;IACvE,yEAAyE;IACzE,SAAyD;QAEzD,mCAAmC;QACnC,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnE,CAAC;QAED,oCAAoC;QACpC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,CAAqB,CAAC;QAC3D,CAAC;QAED,OAAO,IAAwB,CAAC;IACpC,CAAC;IAES,qBAAqB;QAC3B,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC;YAC7F,gEAAgE;YAChE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;IACL,CAAC;IAES,MAAM;QACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;aAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAChC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IAES,UAAU,CAAC,GAAM;QACvB,oDAAoD;QACpD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,GAAG,CAAC;IACf,CAAC;IAES,UAAU,CAAC,CAAU;QAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAa,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC,QAAa,CAAC;IAC9B,CAAC;IAEM,WAAW,CAAC,GAAM;QACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,gCAAgC;QAEnD,iDAAiD;QACjD,oDAAoD;QACpD,8DAA8D;QAC9D,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QAErB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAES,QAAQ,CAAC,GAAY;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAES,UAAU;QAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,IAAI,SAAS,GAAsB,IAAI,CAAC;QACxC,IAAI,CAAC;YACD,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEhC,+CAA+C;YAC/C,6BAA6B;YAC7B,yEAAyE;YACzE,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;YACxC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC;YAC9B,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;gBAC5C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YAED,OAAO,KAAK,CAAC;QACjB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC,SAAc,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACP,IAAI,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;gBACjE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACvC,CAAC;QACL,CAAC;IACL,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE/C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAE1B,wCAAwC;QACxC,kCAAkC;QAClC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACX,UAAU,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAES,UAAU,CAAC,GAAY;QAC7B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC;QACf,CAAC;QACD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,OAAO,CAAC;QACvB,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC;IAC1C,CAAC;CACJ"}
|
package/esm/lazy/types.js
CHANGED
package/esm/lazy/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lazy/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lazy/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extendObject.js","sourceRoot":"","sources":["../../../src/structures/extendObject.ts"],"names":[],"mappings":"AAcA,qDAAqD;AACrD,MAAM,UAAU,YAAY,CAC1B,IAAO,EACP,uBAAiD;IAEjD,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,CAAmB,CAAC;AAClF,CAAC"}
|
package/package.json
CHANGED
package/tsconfig.cjs.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/api/builder.ts","../src/api/call.config.ts","../src/api/call.ts","../src/api/call.types.ts","../src/api/config.ts","../src/api/endpoint.ts","../src/api/endpoint.types.ts","../src/api/error.ts","../src/api/hooks.ts","../src/api/index.ts","../src/api/interceptor.ts","../src/api/logging.ts","../src/api/methods.ts","../src/api/statuscodes.ts","../src/api/extensions/contenttype.ts","../src/api/extensions/endpointhooks.ts","../src/api/extensions/index.ts","../src/api/extensions/validation.ts","../src/async/arrays.ts","../src/async/index.ts","../src/async/manualpromise.ts","../src/async/misc.ts","../src/async/timeout.ts","../src/dates/calc.ts","../src/dates/calendarindex.ts","../src/dates/convert.ts","../src/dates/datex.ts","../src/dates/decompose.ts","../src/dates/format.ts","../src/dates/index.ts","../src/dates/parse.ts","../src/dates/period.ts","../src/dates/shift.ts","../src/dates/types.ts","../src/dates/tz.ts","../src/dates/yeardate.ts","../src/fields/filter.ts","../src/fields/index.ts","../src/fields/skip.ts","../src/fields/transfer.ts","../src/fields/update.ts","../src/functions/assert.ts","../src/functions/disposer.symbols.ts","../src/functions/disposer.ts","../src/functions/index.ts","../src/functions/safe.ts","../src/functions/throttle.ts","../src/lazy/index.ts","../src/lazy/lazy.ts","../src/lazy/light.ts","../src/lazy/promise.ts","../src/lazy/types.ts","../src/localization/localizationmanager.ts","../src/localization/localizedvalidationerrors.ts","../src/localization/abstractions.ts","../src/localization/index.ts","../src/localization/defaults/validationerrorslocalization.ts","../src/localization/defaults/defaultshape.ts","../src/logger/batch.ts","../src/logger/console.ts","../src/logger/empty.ts","../src/logger/index.ts","../src/logger/loggable.ts","../src/logger/manager.ts","../src/logger/named.ts","../src/logger/provider.ts","../src/logger/proxy.ts","../src/logger/types.ts","../src/logger/buffered/base.ts","../src/logger/buffered/buffered.logger.ts","../src/logger/buffered/buffered.memory.ts","../src/logger/buffered/index.ts","../src/logger/buffered/file/buffered.file.ts","../src/logger/buffered/file/index.ts","../src/math/arrays.ts","../src/math/calc.ts","../src/math/distribution.ts","../src/math/index.ts","../src/math/object/helpers.ts","../src/math/object/index.ts","../src/math/object/math.composite.ts","../src/math/object/math.ts","../src/math/object/ops.composite.ts","../src/math/object/ops.ts","../src/math/object/types.ts","../src/models/entitywithstatus.ts","../src/models/file.ts","../src/models/loading.ts","../src/models/logicmodel.ts","../src/models/model.ts","../src/models/valuescollector.ts","../src/models/types.ts","../src/models/wrappers.ts","../src/observing/event.late.ts","../src/observing/event.ts","../src/observing/progresstracker.ts","../src/observing/throttledevent.ts","../src/observing/timeout.ts","../src/observing/timer.ts","../src/observing/transition.ts","../src/storage/index.ts","../src/storage/types.ts","../src/storage/wrappers.ts","../src/structures/expire.ts","../src/structures/linkedlist.ts","../src/structures/nameof.ts","../src/structures/pool.ts","../src/structures/promisecache.ts","../src/structures/promiseextended.ts","../src/structures/promiseproxy.ts","../src/structures/singleton.ts","../src/structures/subscribersmap.ts","../src/structures/tempocache.ts","../src/structures/helpers/enum.ts","../src/structures/helpers/name.ts","../src/structures/path/builder.helpers.ts","../src/structures/path/builder.ts","../src/structures/path/index.ts","../src/structures/path/types.helpers.ts","../src/structures/path/types.ts","../src/structures/path/utils/combineurls.ts","../src/structures/path/utils/index.ts","../src/structures/path/utils/indextrim.ts","../src/structures/path/utils/optionals.ts","../src/structures/queue/parallel.ts","../src/structures/queue/tasks.ts","../src/types/arrays.ts","../src/types/comparator.ts","../src/types/deep.ts","../src/types/functions.ts","../src/types/getter.ts","../src/types/ident.ts","../src/types/index.ts","../src/types/misc.ts","../src/validation/validationerrors.ts","../src/validation/creditcard.ts","../src/validation/emails.ts","../src/validation/helpers.ts","../src/validation/index.ts","../src/validation/throwers.ts","../src/validation/types.ts","../src/validation/validationerror.ts","../src/validation/validators.ts","../src/validation/wrappers.ts"],"version":"5.7.3"}
|
|
1
|
+
{"root":["../src/api/builder.ts","../src/api/call.config.ts","../src/api/call.ts","../src/api/call.types.ts","../src/api/config.ts","../src/api/endpoint.ts","../src/api/endpoint.types.ts","../src/api/error.ts","../src/api/hooks.ts","../src/api/index.ts","../src/api/interceptor.ts","../src/api/logging.ts","../src/api/methods.ts","../src/api/statuscodes.ts","../src/api/extensions/contenttype.ts","../src/api/extensions/endpointhooks.ts","../src/api/extensions/index.ts","../src/api/extensions/validation.ts","../src/async/arrays.ts","../src/async/index.ts","../src/async/manualpromise.ts","../src/async/misc.ts","../src/async/timeout.ts","../src/dates/calc.ts","../src/dates/calendarindex.ts","../src/dates/convert.ts","../src/dates/datex.ts","../src/dates/decompose.ts","../src/dates/format.ts","../src/dates/index.ts","../src/dates/parse.ts","../src/dates/period.ts","../src/dates/shift.ts","../src/dates/types.ts","../src/dates/tz.ts","../src/dates/yeardate.ts","../src/fields/filter.ts","../src/fields/index.ts","../src/fields/skip.ts","../src/fields/transfer.ts","../src/fields/update.ts","../src/functions/assert.ts","../src/functions/disposer.symbols.ts","../src/functions/disposer.ts","../src/functions/index.ts","../src/functions/safe.ts","../src/functions/throttle.ts","../src/lazy/extensions.ts","../src/lazy/index.ts","../src/lazy/lazy.ts","../src/lazy/light.ts","../src/lazy/promise.ts","../src/lazy/types.ts","../src/localization/localizationmanager.ts","../src/localization/localizedvalidationerrors.ts","../src/localization/abstractions.ts","../src/localization/index.ts","../src/localization/defaults/validationerrorslocalization.ts","../src/localization/defaults/defaultshape.ts","../src/logger/batch.ts","../src/logger/console.ts","../src/logger/empty.ts","../src/logger/index.ts","../src/logger/loggable.ts","../src/logger/manager.ts","../src/logger/named.ts","../src/logger/provider.ts","../src/logger/proxy.ts","../src/logger/types.ts","../src/logger/buffered/base.ts","../src/logger/buffered/buffered.logger.ts","../src/logger/buffered/buffered.memory.ts","../src/logger/buffered/index.ts","../src/logger/buffered/file/buffered.file.ts","../src/logger/buffered/file/index.ts","../src/math/arrays.ts","../src/math/calc.ts","../src/math/distribution.ts","../src/math/index.ts","../src/math/object/helpers.ts","../src/math/object/index.ts","../src/math/object/math.composite.ts","../src/math/object/math.ts","../src/math/object/ops.composite.ts","../src/math/object/ops.ts","../src/math/object/types.ts","../src/models/entitywithstatus.ts","../src/models/file.ts","../src/models/loading.ts","../src/models/logicmodel.ts","../src/models/model.ts","../src/models/valuescollector.ts","../src/models/types.ts","../src/models/wrappers.ts","../src/observing/event.late.ts","../src/observing/event.ts","../src/observing/progresstracker.ts","../src/observing/throttledevent.ts","../src/observing/timeout.ts","../src/observing/timer.ts","../src/observing/transition.ts","../src/storage/index.ts","../src/storage/types.ts","../src/storage/wrappers.ts","../src/structures/expire.ts","../src/structures/extendobject.ts","../src/structures/linkedlist.ts","../src/structures/nameof.ts","../src/structures/pool.ts","../src/structures/promisecache.ts","../src/structures/promiseextended.ts","../src/structures/promiseproxy.ts","../src/structures/singleton.ts","../src/structures/subscribersmap.ts","../src/structures/tempocache.ts","../src/structures/helpers/enum.ts","../src/structures/helpers/name.ts","../src/structures/path/builder.helpers.ts","../src/structures/path/builder.ts","../src/structures/path/index.ts","../src/structures/path/types.helpers.ts","../src/structures/path/types.ts","../src/structures/path/utils/combineurls.ts","../src/structures/path/utils/index.ts","../src/structures/path/utils/indextrim.ts","../src/structures/path/utils/optionals.ts","../src/structures/queue/parallel.ts","../src/structures/queue/tasks.ts","../src/types/arrays.ts","../src/types/comparator.ts","../src/types/deep.ts","../src/types/functions.ts","../src/types/getter.ts","../src/types/ident.ts","../src/types/index.ts","../src/types/misc.ts","../src/validation/validationerrors.ts","../src/validation/creditcard.ts","../src/validation/emails.ts","../src/validation/helpers.ts","../src/validation/index.ts","../src/validation/throwers.ts","../src/validation/types.ts","../src/validation/validationerror.ts","../src/validation/validators.ts","../src/validation/wrappers.ts"],"version":"5.7.3"}
|
package/tsconfig.esm.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/api/builder.ts","../src/api/call.config.ts","../src/api/call.ts","../src/api/call.types.ts","../src/api/config.ts","../src/api/endpoint.ts","../src/api/endpoint.types.ts","../src/api/error.ts","../src/api/hooks.ts","../src/api/index.ts","../src/api/interceptor.ts","../src/api/logging.ts","../src/api/methods.ts","../src/api/statuscodes.ts","../src/api/extensions/contenttype.ts","../src/api/extensions/endpointhooks.ts","../src/api/extensions/index.ts","../src/api/extensions/validation.ts","../src/async/arrays.ts","../src/async/index.ts","../src/async/manualpromise.ts","../src/async/misc.ts","../src/async/timeout.ts","../src/dates/calc.ts","../src/dates/calendarindex.ts","../src/dates/convert.ts","../src/dates/datex.ts","../src/dates/decompose.ts","../src/dates/format.ts","../src/dates/index.ts","../src/dates/parse.ts","../src/dates/period.ts","../src/dates/shift.ts","../src/dates/types.ts","../src/dates/tz.ts","../src/dates/yeardate.ts","../src/fields/filter.ts","../src/fields/index.ts","../src/fields/skip.ts","../src/fields/transfer.ts","../src/fields/update.ts","../src/functions/assert.ts","../src/functions/disposer.symbols.ts","../src/functions/disposer.ts","../src/functions/index.ts","../src/functions/safe.ts","../src/functions/throttle.ts","../src/lazy/index.ts","../src/lazy/lazy.ts","../src/lazy/light.ts","../src/lazy/promise.ts","../src/lazy/types.ts","../src/localization/localizationmanager.ts","../src/localization/localizedvalidationerrors.ts","../src/localization/abstractions.ts","../src/localization/index.ts","../src/localization/defaults/validationerrorslocalization.ts","../src/localization/defaults/defaultshape.ts","../src/logger/batch.ts","../src/logger/console.ts","../src/logger/empty.ts","../src/logger/index.ts","../src/logger/loggable.ts","../src/logger/manager.ts","../src/logger/named.ts","../src/logger/provider.ts","../src/logger/proxy.ts","../src/logger/types.ts","../src/logger/buffered/base.ts","../src/logger/buffered/buffered.logger.ts","../src/logger/buffered/buffered.memory.ts","../src/logger/buffered/index.ts","../src/logger/buffered/file/buffered.file.ts","../src/logger/buffered/file/index.ts","../src/math/arrays.ts","../src/math/calc.ts","../src/math/distribution.ts","../src/math/index.ts","../src/math/object/helpers.ts","../src/math/object/index.ts","../src/math/object/math.composite.ts","../src/math/object/math.ts","../src/math/object/ops.composite.ts","../src/math/object/ops.ts","../src/math/object/types.ts","../src/models/entitywithstatus.ts","../src/models/file.ts","../src/models/loading.ts","../src/models/logicmodel.ts","../src/models/model.ts","../src/models/valuescollector.ts","../src/models/types.ts","../src/models/wrappers.ts","../src/observing/event.late.ts","../src/observing/event.ts","../src/observing/progresstracker.ts","../src/observing/throttledevent.ts","../src/observing/timeout.ts","../src/observing/timer.ts","../src/observing/transition.ts","../src/storage/index.ts","../src/storage/types.ts","../src/storage/wrappers.ts","../src/structures/expire.ts","../src/structures/linkedlist.ts","../src/structures/nameof.ts","../src/structures/pool.ts","../src/structures/promisecache.ts","../src/structures/promiseextended.ts","../src/structures/promiseproxy.ts","../src/structures/singleton.ts","../src/structures/subscribersmap.ts","../src/structures/tempocache.ts","../src/structures/helpers/enum.ts","../src/structures/helpers/name.ts","../src/structures/path/builder.helpers.ts","../src/structures/path/builder.ts","../src/structures/path/index.ts","../src/structures/path/types.helpers.ts","../src/structures/path/types.ts","../src/structures/path/utils/combineurls.ts","../src/structures/path/utils/index.ts","../src/structures/path/utils/indextrim.ts","../src/structures/path/utils/optionals.ts","../src/structures/queue/parallel.ts","../src/structures/queue/tasks.ts","../src/types/arrays.ts","../src/types/comparator.ts","../src/types/deep.ts","../src/types/functions.ts","../src/types/getter.ts","../src/types/ident.ts","../src/types/index.ts","../src/types/misc.ts","../src/validation/validationerrors.ts","../src/validation/creditcard.ts","../src/validation/emails.ts","../src/validation/helpers.ts","../src/validation/index.ts","../src/validation/throwers.ts","../src/validation/types.ts","../src/validation/validationerror.ts","../src/validation/validators.ts","../src/validation/wrappers.ts"],"version":"5.7.3"}
|
|
1
|
+
{"root":["../src/api/builder.ts","../src/api/call.config.ts","../src/api/call.ts","../src/api/call.types.ts","../src/api/config.ts","../src/api/endpoint.ts","../src/api/endpoint.types.ts","../src/api/error.ts","../src/api/hooks.ts","../src/api/index.ts","../src/api/interceptor.ts","../src/api/logging.ts","../src/api/methods.ts","../src/api/statuscodes.ts","../src/api/extensions/contenttype.ts","../src/api/extensions/endpointhooks.ts","../src/api/extensions/index.ts","../src/api/extensions/validation.ts","../src/async/arrays.ts","../src/async/index.ts","../src/async/manualpromise.ts","../src/async/misc.ts","../src/async/timeout.ts","../src/dates/calc.ts","../src/dates/calendarindex.ts","../src/dates/convert.ts","../src/dates/datex.ts","../src/dates/decompose.ts","../src/dates/format.ts","../src/dates/index.ts","../src/dates/parse.ts","../src/dates/period.ts","../src/dates/shift.ts","../src/dates/types.ts","../src/dates/tz.ts","../src/dates/yeardate.ts","../src/fields/filter.ts","../src/fields/index.ts","../src/fields/skip.ts","../src/fields/transfer.ts","../src/fields/update.ts","../src/functions/assert.ts","../src/functions/disposer.symbols.ts","../src/functions/disposer.ts","../src/functions/index.ts","../src/functions/safe.ts","../src/functions/throttle.ts","../src/lazy/extensions.ts","../src/lazy/index.ts","../src/lazy/lazy.ts","../src/lazy/light.ts","../src/lazy/promise.ts","../src/lazy/types.ts","../src/localization/localizationmanager.ts","../src/localization/localizedvalidationerrors.ts","../src/localization/abstractions.ts","../src/localization/index.ts","../src/localization/defaults/validationerrorslocalization.ts","../src/localization/defaults/defaultshape.ts","../src/logger/batch.ts","../src/logger/console.ts","../src/logger/empty.ts","../src/logger/index.ts","../src/logger/loggable.ts","../src/logger/manager.ts","../src/logger/named.ts","../src/logger/provider.ts","../src/logger/proxy.ts","../src/logger/types.ts","../src/logger/buffered/base.ts","../src/logger/buffered/buffered.logger.ts","../src/logger/buffered/buffered.memory.ts","../src/logger/buffered/index.ts","../src/logger/buffered/file/buffered.file.ts","../src/logger/buffered/file/index.ts","../src/math/arrays.ts","../src/math/calc.ts","../src/math/distribution.ts","../src/math/index.ts","../src/math/object/helpers.ts","../src/math/object/index.ts","../src/math/object/math.composite.ts","../src/math/object/math.ts","../src/math/object/ops.composite.ts","../src/math/object/ops.ts","../src/math/object/types.ts","../src/models/entitywithstatus.ts","../src/models/file.ts","../src/models/loading.ts","../src/models/logicmodel.ts","../src/models/model.ts","../src/models/valuescollector.ts","../src/models/types.ts","../src/models/wrappers.ts","../src/observing/event.late.ts","../src/observing/event.ts","../src/observing/progresstracker.ts","../src/observing/throttledevent.ts","../src/observing/timeout.ts","../src/observing/timer.ts","../src/observing/transition.ts","../src/storage/index.ts","../src/storage/types.ts","../src/storage/wrappers.ts","../src/structures/expire.ts","../src/structures/extendobject.ts","../src/structures/linkedlist.ts","../src/structures/nameof.ts","../src/structures/pool.ts","../src/structures/promisecache.ts","../src/structures/promiseextended.ts","../src/structures/promiseproxy.ts","../src/structures/singleton.ts","../src/structures/subscribersmap.ts","../src/structures/tempocache.ts","../src/structures/helpers/enum.ts","../src/structures/helpers/name.ts","../src/structures/path/builder.helpers.ts","../src/structures/path/builder.ts","../src/structures/path/index.ts","../src/structures/path/types.helpers.ts","../src/structures/path/types.ts","../src/structures/path/utils/combineurls.ts","../src/structures/path/utils/index.ts","../src/structures/path/utils/indextrim.ts","../src/structures/path/utils/optionals.ts","../src/structures/queue/parallel.ts","../src/structures/queue/tasks.ts","../src/types/arrays.ts","../src/types/comparator.ts","../src/types/deep.ts","../src/types/functions.ts","../src/types/getter.ts","../src/types/ident.ts","../src/types/index.ts","../src/types/misc.ts","../src/validation/validationerrors.ts","../src/validation/creditcard.ts","../src/validation/emails.ts","../src/validation/helpers.ts","../src/validation/index.ts","../src/validation/throwers.ts","../src/validation/types.ts","../src/validation/validationerror.ts","../src/validation/validators.ts","../src/validation/wrappers.ts"],"version":"5.7.3"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/api/builder.ts","../src/api/call.config.ts","../src/api/call.ts","../src/api/call.types.ts","../src/api/config.ts","../src/api/endpoint.ts","../src/api/endpoint.types.ts","../src/api/error.ts","../src/api/hooks.ts","../src/api/index.ts","../src/api/interceptor.ts","../src/api/logging.ts","../src/api/methods.ts","../src/api/statuscodes.ts","../src/api/extensions/contenttype.ts","../src/api/extensions/endpointhooks.ts","../src/api/extensions/index.ts","../src/api/extensions/validation.ts","../src/async/arrays.ts","../src/async/index.ts","../src/async/manualpromise.ts","../src/async/misc.ts","../src/async/timeout.ts","../src/dates/calc.ts","../src/dates/calendarindex.ts","../src/dates/convert.ts","../src/dates/datex.ts","../src/dates/decompose.ts","../src/dates/format.ts","../src/dates/index.ts","../src/dates/parse.ts","../src/dates/period.ts","../src/dates/shift.ts","../src/dates/types.ts","../src/dates/tz.ts","../src/dates/yeardate.ts","../src/fields/filter.ts","../src/fields/index.ts","../src/fields/skip.ts","../src/fields/transfer.ts","../src/fields/update.ts","../src/functions/assert.ts","../src/functions/disposer.symbols.ts","../src/functions/disposer.ts","../src/functions/index.ts","../src/functions/safe.ts","../src/functions/throttle.ts","../src/lazy/index.ts","../src/lazy/lazy.ts","../src/lazy/light.ts","../src/lazy/promise.ts","../src/lazy/types.ts","../src/localization/localizationmanager.ts","../src/localization/localizedvalidationerrors.ts","../src/localization/abstractions.ts","../src/localization/index.ts","../src/localization/defaults/validationerrorslocalization.ts","../src/localization/defaults/defaultshape.ts","../src/logger/batch.ts","../src/logger/console.ts","../src/logger/empty.ts","../src/logger/index.ts","../src/logger/loggable.ts","../src/logger/manager.ts","../src/logger/named.ts","../src/logger/provider.ts","../src/logger/proxy.ts","../src/logger/types.ts","../src/logger/buffered/base.ts","../src/logger/buffered/buffered.logger.ts","../src/logger/buffered/buffered.memory.ts","../src/logger/buffered/index.ts","../src/logger/buffered/file/buffered.file.ts","../src/logger/buffered/file/index.ts","../src/math/arrays.ts","../src/math/calc.ts","../src/math/distribution.ts","../src/math/index.ts","../src/math/object/helpers.ts","../src/math/object/index.ts","../src/math/object/math.composite.ts","../src/math/object/math.ts","../src/math/object/ops.composite.ts","../src/math/object/ops.ts","../src/math/object/types.ts","../src/models/entitywithstatus.ts","../src/models/file.ts","../src/models/loading.ts","../src/models/logicmodel.ts","../src/models/model.ts","../src/models/valuescollector.ts","../src/models/types.ts","../src/models/wrappers.ts","../src/observing/event.late.ts","../src/observing/event.ts","../src/observing/progresstracker.ts","../src/observing/throttledevent.ts","../src/observing/timeout.ts","../src/observing/timer.ts","../src/observing/transition.ts","../src/storage/index.ts","../src/storage/types.ts","../src/storage/wrappers.ts","../src/structures/expire.ts","../src/structures/linkedlist.ts","../src/structures/nameof.ts","../src/structures/pool.ts","../src/structures/promisecache.ts","../src/structures/promiseextended.ts","../src/structures/promiseproxy.ts","../src/structures/singleton.ts","../src/structures/subscribersmap.ts","../src/structures/tempocache.ts","../src/structures/helpers/enum.ts","../src/structures/helpers/name.ts","../src/structures/path/builder.helpers.ts","../src/structures/path/builder.ts","../src/structures/path/index.ts","../src/structures/path/types.helpers.ts","../src/structures/path/types.ts","../src/structures/path/utils/combineurls.ts","../src/structures/path/utils/index.ts","../src/structures/path/utils/indextrim.ts","../src/structures/path/utils/optionals.ts","../src/structures/queue/parallel.ts","../src/structures/queue/tasks.ts","../src/types/arrays.ts","../src/types/comparator.ts","../src/types/deep.ts","../src/types/functions.ts","../src/types/getter.ts","../src/types/ident.ts","../src/types/index.ts","../src/types/misc.ts","../src/validation/validationerrors.ts","../src/validation/creditcard.ts","../src/validation/emails.ts","../src/validation/helpers.ts","../src/validation/index.ts","../src/validation/throwers.ts","../src/validation/types.ts","../src/validation/validationerror.ts","../src/validation/validators.ts","../src/validation/wrappers.ts"],"version":"5.7.3"}
|
|
1
|
+
{"root":["../src/api/builder.ts","../src/api/call.config.ts","../src/api/call.ts","../src/api/call.types.ts","../src/api/config.ts","../src/api/endpoint.ts","../src/api/endpoint.types.ts","../src/api/error.ts","../src/api/hooks.ts","../src/api/index.ts","../src/api/interceptor.ts","../src/api/logging.ts","../src/api/methods.ts","../src/api/statuscodes.ts","../src/api/extensions/contenttype.ts","../src/api/extensions/endpointhooks.ts","../src/api/extensions/index.ts","../src/api/extensions/validation.ts","../src/async/arrays.ts","../src/async/index.ts","../src/async/manualpromise.ts","../src/async/misc.ts","../src/async/timeout.ts","../src/dates/calc.ts","../src/dates/calendarindex.ts","../src/dates/convert.ts","../src/dates/datex.ts","../src/dates/decompose.ts","../src/dates/format.ts","../src/dates/index.ts","../src/dates/parse.ts","../src/dates/period.ts","../src/dates/shift.ts","../src/dates/types.ts","../src/dates/tz.ts","../src/dates/yeardate.ts","../src/fields/filter.ts","../src/fields/index.ts","../src/fields/skip.ts","../src/fields/transfer.ts","../src/fields/update.ts","../src/functions/assert.ts","../src/functions/disposer.symbols.ts","../src/functions/disposer.ts","../src/functions/index.ts","../src/functions/safe.ts","../src/functions/throttle.ts","../src/lazy/extensions.ts","../src/lazy/index.ts","../src/lazy/lazy.ts","../src/lazy/light.ts","../src/lazy/promise.ts","../src/lazy/types.ts","../src/localization/localizationmanager.ts","../src/localization/localizedvalidationerrors.ts","../src/localization/abstractions.ts","../src/localization/index.ts","../src/localization/defaults/validationerrorslocalization.ts","../src/localization/defaults/defaultshape.ts","../src/logger/batch.ts","../src/logger/console.ts","../src/logger/empty.ts","../src/logger/index.ts","../src/logger/loggable.ts","../src/logger/manager.ts","../src/logger/named.ts","../src/logger/provider.ts","../src/logger/proxy.ts","../src/logger/types.ts","../src/logger/buffered/base.ts","../src/logger/buffered/buffered.logger.ts","../src/logger/buffered/buffered.memory.ts","../src/logger/buffered/index.ts","../src/logger/buffered/file/buffered.file.ts","../src/logger/buffered/file/index.ts","../src/math/arrays.ts","../src/math/calc.ts","../src/math/distribution.ts","../src/math/index.ts","../src/math/object/helpers.ts","../src/math/object/index.ts","../src/math/object/math.composite.ts","../src/math/object/math.ts","../src/math/object/ops.composite.ts","../src/math/object/ops.ts","../src/math/object/types.ts","../src/models/entitywithstatus.ts","../src/models/file.ts","../src/models/loading.ts","../src/models/logicmodel.ts","../src/models/model.ts","../src/models/valuescollector.ts","../src/models/types.ts","../src/models/wrappers.ts","../src/observing/event.late.ts","../src/observing/event.ts","../src/observing/progresstracker.ts","../src/observing/throttledevent.ts","../src/observing/timeout.ts","../src/observing/timer.ts","../src/observing/transition.ts","../src/storage/index.ts","../src/storage/types.ts","../src/storage/wrappers.ts","../src/structures/expire.ts","../src/structures/extendobject.ts","../src/structures/linkedlist.ts","../src/structures/nameof.ts","../src/structures/pool.ts","../src/structures/promisecache.ts","../src/structures/promiseextended.ts","../src/structures/promiseproxy.ts","../src/structures/singleton.ts","../src/structures/subscribersmap.ts","../src/structures/tempocache.ts","../src/structures/helpers/enum.ts","../src/structures/helpers/name.ts","../src/structures/path/builder.helpers.ts","../src/structures/path/builder.ts","../src/structures/path/index.ts","../src/structures/path/types.helpers.ts","../src/structures/path/types.ts","../src/structures/path/utils/combineurls.ts","../src/structures/path/utils/index.ts","../src/structures/path/utils/indextrim.ts","../src/structures/path/utils/optionals.ts","../src/structures/queue/parallel.ts","../src/structures/queue/tasks.ts","../src/types/arrays.ts","../src/types/comparator.ts","../src/types/deep.ts","../src/types/functions.ts","../src/types/getter.ts","../src/types/ident.ts","../src/types/index.ts","../src/types/misc.ts","../src/validation/validationerrors.ts","../src/validation/creditcard.ts","../src/validation/emails.ts","../src/validation/helpers.ts","../src/validation/index.ts","../src/validation/throwers.ts","../src/validation/types.ts","../src/validation/validationerror.ts","../src/validation/validators.ts","../src/validation/wrappers.ts"],"version":"5.7.3"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IKeyedStorage, IKeyedStorageSync } from '../storage/types.js';
|
|
2
|
+
import type { ILazyPromiseExtension } from './types.js';
|
|
3
|
+
export interface ICachedLazyPromiseExtension<T, TStorage extends IKeyedStorage<T> | IKeyedStorageSync<T>> {
|
|
4
|
+
readonly cache: TStorage;
|
|
5
|
+
/** Resets the current value to undefined and cleans up the cache. */
|
|
6
|
+
resetWithCache(): void;
|
|
7
|
+
/** Sets the current value and updates the cache. */
|
|
8
|
+
setCachedInstance(value: T | undefined): T | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare function createCacheExtension<T, TStorage extends IKeyedStorage<T> | IKeyedStorageSync<T>>(storage: TStorage): ILazyPromiseExtension<T, ICachedLazyPromiseExtension<T, TStorage>>;
|
package/types/lazy/lazy.d.ts
CHANGED
|
@@ -7,17 +7,20 @@ export declare class Lazy<T> implements ILazy<T>, IDisposable, IResettableModel
|
|
|
7
7
|
protected _instance: T | undefined;
|
|
8
8
|
private _expireTracker;
|
|
9
9
|
private _disposer?;
|
|
10
|
+
private _error;
|
|
10
11
|
constructor(_factory: (() => T));
|
|
11
12
|
get hasValue(): boolean;
|
|
12
|
-
get value():
|
|
13
|
+
get value(): T;
|
|
13
14
|
get currentValue(): T | undefined;
|
|
15
|
+
get error(): string | null;
|
|
14
16
|
/** Override me: additional way to make sure instance is valid */
|
|
15
17
|
protected get isValid(): boolean;
|
|
16
18
|
withDisposer(disposer: (prev: T) => void): this;
|
|
17
19
|
withExpire(tracker: IExpireTracker | undefined): this;
|
|
18
|
-
private ensureInstance;
|
|
19
20
|
prewarm(): this;
|
|
20
21
|
setInstance(instance: T | undefined): void;
|
|
21
22
|
reset(): void;
|
|
22
23
|
dispose(): void;
|
|
24
|
+
private ensureInstance;
|
|
25
|
+
protected parseError(err: unknown): string;
|
|
23
26
|
}
|
package/types/lazy/promise.d.ts
CHANGED
|
@@ -1,25 +1,76 @@
|
|
|
1
1
|
import { type IDisposable } from '../functions/disposer.js';
|
|
2
2
|
import type { IResettableModel } from '../models/types.js';
|
|
3
3
|
import type { IExpireTracker } from '../structures/expire.js';
|
|
4
|
-
import type {
|
|
5
|
-
export declare class LazyPromise<T> implements
|
|
6
|
-
private
|
|
7
|
-
private readonly
|
|
4
|
+
import type { IControllableLazyPromise, ILazyPromiseExtension, LazyFactory } from './types.js';
|
|
5
|
+
export declare class LazyPromise<T, TInitial extends T | undefined = undefined> implements IControllableLazyPromise<T, TInitial>, IDisposable, IResettableModel {
|
|
6
|
+
private _factory;
|
|
7
|
+
private readonly _initial;
|
|
8
8
|
private _instance;
|
|
9
9
|
private _isLoading;
|
|
10
10
|
private _promise;
|
|
11
11
|
private _expireTracker;
|
|
12
|
-
|
|
12
|
+
private _lastRefreshingPromise;
|
|
13
|
+
private _error;
|
|
14
|
+
constructor(factory: LazyFactory<T>, initial?: TInitial);
|
|
13
15
|
get isLoading(): boolean | null;
|
|
14
16
|
get hasValue(): boolean;
|
|
17
|
+
get error(): string | null;
|
|
15
18
|
get promise(): Promise<T>;
|
|
16
|
-
get value():
|
|
19
|
+
get value(): T | TInitial;
|
|
17
20
|
/** does not calls factory */
|
|
18
|
-
get currentValue(): T |
|
|
21
|
+
get currentValue(): T | TInitial;
|
|
19
22
|
withExpire(tracker: IExpireTracker | undefined): this;
|
|
23
|
+
/**
|
|
24
|
+
* Extends this instance with additional functionality by applying extensions in place.
|
|
25
|
+
*
|
|
26
|
+
* **Capabilities:**
|
|
27
|
+
* - `overrideFactory`: Wrap the factory function (logging, retry, caching, etc.)
|
|
28
|
+
* - `extendShape`: Add custom properties/methods to the instance
|
|
29
|
+
*
|
|
30
|
+
* **Type Safety:**
|
|
31
|
+
* - Use `ILazyPromiseExtension<any>` for universal extensions
|
|
32
|
+
* - Use `ILazyPromiseExtension<ConcreteType>` for type-specific extensions (e.g., number-only)
|
|
33
|
+
*
|
|
34
|
+
* **Note:** Extensions mutate the instance and can be chained. Subclasses preserve their type.
|
|
35
|
+
*
|
|
36
|
+
* @param extension - Configuration with factory override and/or shape extensions
|
|
37
|
+
* @returns The same instance (this) with applied extensions
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Universal logging extension
|
|
42
|
+
* const logged = lazy.extend({
|
|
43
|
+
* overrideFactory: (factory) => async (refreshing) => {
|
|
44
|
+
* console.log('Loading...');
|
|
45
|
+
* return await factory(refreshing);
|
|
46
|
+
* }
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* // Type-specific extension with custom methods
|
|
50
|
+
* const enhanced = lazyNumber.extend<{ double: () => number | undefined }>({
|
|
51
|
+
* extendShape: (instance) => Object.assign(instance, {
|
|
52
|
+
* double: () => instance.currentValue !== undefined
|
|
53
|
+
* ? instance.currentValue * 2
|
|
54
|
+
* : undefined
|
|
55
|
+
* })
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* // Chaining multiple extensions
|
|
59
|
+
* const composed = lazy
|
|
60
|
+
* .extend(cacheExtension)
|
|
61
|
+
* .extend(loggingExtension);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
extend<TExtShape extends object = object>(extension: Partial<ILazyPromiseExtension<any, TExtShape>>): object extends TExtShape ? this : this & TExtShape;
|
|
20
65
|
protected ensureInstanceLoading(): void;
|
|
66
|
+
protected doLoad(): void;
|
|
21
67
|
protected onResolved(res: T): T;
|
|
22
|
-
|
|
68
|
+
protected onRejected(e: unknown): T;
|
|
69
|
+
setInstance(res: T): T;
|
|
70
|
+
protected setError(err: unknown): void;
|
|
71
|
+
protected clearError(): void;
|
|
72
|
+
refresh(): Promise<T>;
|
|
23
73
|
reset(): void;
|
|
24
74
|
dispose(): void;
|
|
75
|
+
protected parseError(err: unknown): string;
|
|
25
76
|
}
|
package/types/lazy/types.d.ts
CHANGED
|
@@ -1,16 +1,110 @@
|
|
|
1
|
+
import type { IResettableModel } from '../models/types.js';
|
|
1
2
|
/** Represents a lazily loaded value. */
|
|
2
3
|
export interface ILazy<T> {
|
|
3
4
|
/** Returns current value. If not loaded, loading is triggered. */
|
|
4
5
|
readonly value: T;
|
|
5
|
-
/** Returns whether has current value.
|
|
6
|
+
/** Returns whether has current value. Accessing this property does not trigger loading. */
|
|
6
7
|
readonly hasValue: boolean;
|
|
7
|
-
/** Returns current value or undefined if not present.
|
|
8
|
+
/** Returns current value or undefined if not present. Accessing this property does not trigger loading. */
|
|
8
9
|
readonly currentValue: T | undefined;
|
|
10
|
+
/** Returns error message if loading failed, null otherwise. Accessing this property does not trigger loading. */
|
|
11
|
+
readonly error: string | null;
|
|
9
12
|
}
|
|
10
13
|
/** Represents a lazily asynchronously loaded value. */
|
|
11
|
-
export interface ILazyPromise<T> extends ILazy<T> {
|
|
12
|
-
/**
|
|
14
|
+
export interface ILazyPromise<T, TInitial extends T | undefined = undefined> extends ILazy<T | TInitial> {
|
|
15
|
+
/**
|
|
16
|
+
* Returns true if loading is in progress, false if loading is completed, null if loading was not initiated.
|
|
17
|
+
*
|
|
18
|
+
* Accessing this property does not trigger loading.
|
|
19
|
+
*/
|
|
13
20
|
readonly isLoading: boolean | null;
|
|
14
|
-
/** Returns the promise for the current value. If not loaded,
|
|
21
|
+
/** Returns the promise for the current value. If not loaded, accessing this property triggers loading. */
|
|
15
22
|
readonly promise: Promise<T>;
|
|
23
|
+
/**
|
|
24
|
+
* Refreshes the value by re-executing the factory function.
|
|
25
|
+
* The factory will be called with `refreshing: true` parameter.
|
|
26
|
+
* If multiple refreshes are called concurrently, only the last one will update the instance.
|
|
27
|
+
*
|
|
28
|
+
* **⚠️ Use sparingly:** This method should only be called when you explicitly need fresh data.
|
|
29
|
+
* Over-using refresh defeats the purpose of lazy loading and caching.
|
|
30
|
+
*
|
|
31
|
+
* **Common valid use cases:**
|
|
32
|
+
* - User-initiated refresh action (pull-to-refresh, refresh button)
|
|
33
|
+
* - Cache invalidation after a mutation (e.g., after updating data on server)
|
|
34
|
+
* - Time-based refresh with proper debouncing/throttling
|
|
35
|
+
* - Recovery from an error state
|
|
36
|
+
*
|
|
37
|
+
* **Anti-patterns to avoid:**
|
|
38
|
+
* - Calling refresh on every render or component mount
|
|
39
|
+
* - Using refresh instead of proper cache expiration (use `withExpire` instead)
|
|
40
|
+
* - Calling refresh in loops or high-frequency events without debouncing
|
|
41
|
+
* - Using refresh as a substitute for real-time updates (consider WebSockets/polling instead)
|
|
42
|
+
*
|
|
43
|
+
* @returns Promise that resolves to the refreshed value, or current value if refresh fails.
|
|
44
|
+
*/
|
|
45
|
+
refresh(): Promise<T>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Represents a controllable lazy promise with manual state management capabilities.
|
|
49
|
+
* Extends ILazyPromise and IResettableModel with methods to manually set values and reset state.
|
|
50
|
+
* Use this interface in extensions that need direct control over the lazy value lifecycle.
|
|
51
|
+
*/
|
|
52
|
+
export interface IControllableLazyPromise<T, TInitial extends T | undefined = undefined> extends ILazyPromise<T, TInitial>, IResettableModel {
|
|
53
|
+
/**
|
|
54
|
+
* Manually sets the instance value and marks loading as complete.
|
|
55
|
+
* Useful for cache synchronization and manual state management.
|
|
56
|
+
*
|
|
57
|
+
* @param value - The value to set
|
|
58
|
+
* @returns The value that was set
|
|
59
|
+
*/
|
|
60
|
+
setInstance(value: T): T;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Factory function to retrieve the fresh value.
|
|
64
|
+
*
|
|
65
|
+
* @param refreshing - indicates whether manual refresh is requested
|
|
66
|
+
* */
|
|
67
|
+
export type LazyFactory<T> = (refreshing?: boolean) => Promise<T>;
|
|
68
|
+
/**
|
|
69
|
+
* Extension for LazyPromise instances.
|
|
70
|
+
*
|
|
71
|
+
* @template T - The type of value the extension is compatible with. Use `any` for universal extensions.
|
|
72
|
+
* @template TExtShape - Additional shape added to the extended instance (properties/methods).
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* // Type-specific extension (only for numbers)
|
|
77
|
+
* const doublingExtension: ILazyPromiseExtension<number> = {
|
|
78
|
+
* overrideFactory: (original) => async (refreshing) => {
|
|
79
|
+
* const result = await original(refreshing);
|
|
80
|
+
* return result * 2;
|
|
81
|
+
* }
|
|
82
|
+
* };
|
|
83
|
+
*
|
|
84
|
+
* // Universal extension (works with any type)
|
|
85
|
+
* const loggingExtension: ILazyPromiseExtension<any> = {
|
|
86
|
+
* overrideFactory: (original) => async (refreshing) => {
|
|
87
|
+
* console.log('Loading...');
|
|
88
|
+
* return await original(refreshing);
|
|
89
|
+
* }
|
|
90
|
+
* };
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export interface ILazyPromiseExtension<T = any, TExtShape extends object = object> {
|
|
94
|
+
/**
|
|
95
|
+
* Override or wrap the factory function.
|
|
96
|
+
* @param original - The original factory function
|
|
97
|
+
* @param target - The LazyPromise instance being extended
|
|
98
|
+
* @returns A new factory function
|
|
99
|
+
*/
|
|
100
|
+
overrideFactory?: <TInitial extends T | undefined = undefined>(original: LazyFactory<T>, target: ILazyPromise<T, TInitial>) => LazyFactory<T>;
|
|
101
|
+
/**
|
|
102
|
+
* Extend the instance with additional properties/methods.
|
|
103
|
+
* Receives IControllableLazyPromise which includes setInstance() and reset() methods
|
|
104
|
+
* for manual state management and cache synchronization.
|
|
105
|
+
*
|
|
106
|
+
* @param previous - The controllable LazyPromise instance to extend
|
|
107
|
+
* @returns The instance with additional shape
|
|
108
|
+
*/
|
|
109
|
+
extendShape?: <TInitial extends T | undefined = undefined>(previous: IControllableLazyPromise<T, TInitial>) => IControllableLazyPromise<T, TInitial> & TExtShape;
|
|
16
110
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type BasePropertyDescriptor = Pick<PropertyDescriptor, 'configurable' | 'enumerable' | 'writable'>;
|
|
2
|
+
type PropertyDescriptorTyped<T> = BasePropertyDescriptor & ({
|
|
3
|
+
value: T;
|
|
4
|
+
} | {
|
|
5
|
+
get: () => T;
|
|
6
|
+
set?: (value: T) => void;
|
|
7
|
+
});
|
|
8
|
+
type ExtensionMap<T extends object> = {
|
|
9
|
+
[K in keyof T]: PropertyDescriptorTyped<T[K]>;
|
|
10
|
+
};
|
|
11
|
+
/** Type-safe version of `Object.defineProperties` */
|
|
12
|
+
export declare function extendObject<T extends object, TExtension extends object>(base: T, extensionDescriptorsMap: ExtensionMap<TExtension>): T & TExtension;
|
|
13
|
+
export {};
|