@jscutlery/microwave 0.1.5 → 0.1.6
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/lib/core/engine.d.ts +2 -2
- package/lib/devkit.d.ts +2 -2
- package/package.json +5 -11
- package/fesm2015/jscutlery-microwave.mjs +0 -257
- package/fesm2015/jscutlery-microwave.mjs.map +0 -1
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/jscutlery-microwave.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/apply-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/change-detection-fns.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/engine.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/devkit.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/microwave.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/shared/decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/strategies/asap.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/strategies/async.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/strategies/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/strategies/local.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/strategies/raf.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/strategies/sync.mjs +0 -0
- /package/{fesm2020 → fesm2022}/jscutlery-microwave.mjs +0 -0
- /package/{fesm2020 → fesm2022}/jscutlery-microwave.mjs.map +0 -0
package/lib/core/engine.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { ChangeDetectionFns } from './change-detection-fns';
|
|
|
9
9
|
*/
|
|
10
10
|
export declare function getEngine<COMPONENT, K extends keyof COMPONENT = keyof COMPONENT>(component: COMPONENT): MicrowaveEngine<COMPONENT, K>;
|
|
11
11
|
export declare const _ENGINE_SYMBOL: unique symbol;
|
|
12
|
-
export
|
|
12
|
+
export type Microwaved<T, K extends keyof T = keyof T> = T & {
|
|
13
13
|
[_ENGINE_SYMBOL]?: MicrowaveEngine<T, K>;
|
|
14
14
|
};
|
|
15
15
|
export interface MicrowaveEngine<T, K extends keyof T> {
|
|
@@ -31,5 +31,5 @@ export interface MicrowaveEngine<T, K extends keyof T> {
|
|
|
31
31
|
setProperty<PROP extends K>(property: PROP, value: T[PROP]): void;
|
|
32
32
|
watchProperty<PROP extends K>(property: PROP): Observable<T[PROP] | undefined>;
|
|
33
33
|
}
|
|
34
|
-
export
|
|
34
|
+
export type MicrowaveSubjectsMap<T, K extends keyof T> = Map<K, BehaviorSubject<T[K]>>;
|
|
35
35
|
export declare function _getPropertySubject<T, K extends keyof T, PROP extends K>(subjectsMap: MicrowaveSubjectsMap<T, K>, property: PROP): BehaviorSubject<T[PROP]>;
|
package/lib/devkit.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { MicrowaveEngine } from './core/engine';
|
|
2
2
|
export declare function getStrategyDevKit<COMPONENT, K extends keyof COMPONENT = keyof COMPONENT>(component: COMPONENT): StrategyDevKit<COMPONENT, K>;
|
|
3
|
-
export
|
|
4
|
-
export
|
|
3
|
+
export type StrategyDevKit<T, K extends keyof T = keyof T> = Pick<MicrowaveEngine<T, K>, 'changed$' | 'destroyed$' | 'initialized$' | 'detach' | 'detectChanges'>;
|
|
4
|
+
export type Strategy<T> = (strategyDevKit: StrategyDevKit<T>) => void;
|
package/package.json
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jscutlery/microwave",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^14.0.2",
|
|
6
6
|
"@angular/core": "^14.0.2",
|
|
7
7
|
"rxjs": "^7.0.0"
|
|
8
8
|
},
|
|
9
|
-
"module": "
|
|
10
|
-
"es2020": "fesm2020/jscutlery-microwave.mjs",
|
|
11
|
-
"esm2020": "esm2020/jscutlery-microwave.mjs",
|
|
12
|
-
"fesm2020": "fesm2020/jscutlery-microwave.mjs",
|
|
13
|
-
"fesm2015": "fesm2015/jscutlery-microwave.mjs",
|
|
9
|
+
"module": "fesm2022/jscutlery-microwave.mjs",
|
|
14
10
|
"typings": "index.d.ts",
|
|
15
11
|
"exports": {
|
|
16
12
|
"./package.json": {
|
|
@@ -18,11 +14,9 @@
|
|
|
18
14
|
},
|
|
19
15
|
".": {
|
|
20
16
|
"types": "./index.d.ts",
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"node": "./fesm2015/jscutlery-microwave.mjs",
|
|
25
|
-
"default": "./fesm2020/jscutlery-microwave.mjs"
|
|
17
|
+
"esm2022": "./esm2022/jscutlery-microwave.mjs",
|
|
18
|
+
"esm": "./esm2022/jscutlery-microwave.mjs",
|
|
19
|
+
"default": "./fesm2022/jscutlery-microwave.mjs"
|
|
26
20
|
}
|
|
27
21
|
},
|
|
28
22
|
"sideEffects": false,
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
import { ReplaySubject, BehaviorSubject, take, mapTo, map, concat, takeUntil, audit, timer, animationFrames } from 'rxjs';
|
|
2
|
-
import { ɵɵdirectiveInject, ChangeDetectorRef } from '@angular/core';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* This should stay decoupled from Angular.
|
|
6
|
-
*
|
|
7
|
-
* @param component an instance of anything
|
|
8
|
-
* @returns an set of methods and observables that respectively
|
|
9
|
-
* control and represent the state of the object.
|
|
10
|
-
*/
|
|
11
|
-
function getEngine(component) {
|
|
12
|
-
/* Memoize engine. */
|
|
13
|
-
const microwavedComponent = component;
|
|
14
|
-
const engine = microwavedComponent[_ENGINE_SYMBOL];
|
|
15
|
-
if (engine != null) {
|
|
16
|
-
return engine;
|
|
17
|
-
}
|
|
18
|
-
const destroyed$ = new ReplaySubject(1);
|
|
19
|
-
const initialized$ = new ReplaySubject(1);
|
|
20
|
-
const state$ = new BehaviorSubject({});
|
|
21
|
-
let changeDetectionFns;
|
|
22
|
-
return (microwavedComponent[_ENGINE_SYMBOL] = {
|
|
23
|
-
destroyed$: destroyed$.pipe(take(1)),
|
|
24
|
-
initialized$: initialized$.pipe(take(1)),
|
|
25
|
-
changed$: state$.pipe(mapTo(undefined)),
|
|
26
|
-
detach() {
|
|
27
|
-
changeDetectionFns.detach();
|
|
28
|
-
},
|
|
29
|
-
detectChanges() {
|
|
30
|
-
changeDetectionFns.detectChanges();
|
|
31
|
-
},
|
|
32
|
-
markDestroyed() {
|
|
33
|
-
destroyed$.next();
|
|
34
|
-
},
|
|
35
|
-
markInitialized() {
|
|
36
|
-
initialized$.next();
|
|
37
|
-
},
|
|
38
|
-
setChangeDetectionFns(_changeDetectionFns) {
|
|
39
|
-
changeDetectionFns = _changeDetectionFns;
|
|
40
|
-
},
|
|
41
|
-
getProperty(property) {
|
|
42
|
-
return state$.value[property];
|
|
43
|
-
},
|
|
44
|
-
setProperty(property, value) {
|
|
45
|
-
/* Don't set value if it didn't change.
|
|
46
|
-
* This is more performant than `distinctUntilChanged` all over the place. */
|
|
47
|
-
if (state$.value[property] === value) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
state$.next(Object.assign(Object.assign({}, state$.value), { [property]: value }));
|
|
51
|
-
},
|
|
52
|
-
watchProperty(property) {
|
|
53
|
-
return state$.pipe(map((state) => state[property]));
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
const _ENGINE_SYMBOL = Symbol('MicrowaveEngine');
|
|
58
|
-
function _getPropertySubject(subjectsMap, property) {
|
|
59
|
-
let subject = subjectsMap.get(property);
|
|
60
|
-
if (subject == null) {
|
|
61
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
62
|
-
subject = new BehaviorSubject(undefined);
|
|
63
|
-
subjectsMap.set(property, subject);
|
|
64
|
-
}
|
|
65
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
|
-
return subject;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function getStrategyDevKit(component) {
|
|
70
|
-
const { changed$, destroyed$, initialized$, detach, detectChanges } = getEngine(component);
|
|
71
|
-
return { changed$, destroyed$, initialized$, detach, detectChanges };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Decorate Angular components with custom hooks.
|
|
76
|
-
*
|
|
77
|
-
* @param componentType the component class to decorate.
|
|
78
|
-
* @param hooks
|
|
79
|
-
*/
|
|
80
|
-
function decorateComponent(componentType, hooks) {
|
|
81
|
-
const { onCreate, onInit, onDestroy, onPropertyDeclare, onPropertyGet, onPropertySet, } = hooks;
|
|
82
|
-
if (!componentType.ɵfac) {
|
|
83
|
-
throw new Error(`${componentType.name} is either not a component or not compiled.`);
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Override component factory.
|
|
87
|
-
*/
|
|
88
|
-
const factory = _decorate(componentType.ɵfac,
|
|
89
|
-
/*
|
|
90
|
-
* Override getters & setters.
|
|
91
|
-
*/
|
|
92
|
-
(factoryFn) => () => {
|
|
93
|
-
/* Grab change detector to control it. */
|
|
94
|
-
const cdr = ɵɵdirectiveInject(ChangeDetectorRef);
|
|
95
|
-
const component = factoryFn();
|
|
96
|
-
/**
|
|
97
|
-
* Notify about creation.
|
|
98
|
-
*/
|
|
99
|
-
onCreate(component, {
|
|
100
|
-
detach() {
|
|
101
|
-
cdr.detach();
|
|
102
|
-
},
|
|
103
|
-
detectChanges() {
|
|
104
|
-
cdr.detectChanges();
|
|
105
|
-
},
|
|
106
|
-
});
|
|
107
|
-
/**
|
|
108
|
-
* This will only list initialized properties.
|
|
109
|
-
* That's the reason why all properties should be initialized
|
|
110
|
-
* when using Microwave.
|
|
111
|
-
*/
|
|
112
|
-
for (const property of Object.getOwnPropertyNames(component)) {
|
|
113
|
-
/**
|
|
114
|
-
* Notify when property is discovered.
|
|
115
|
-
*/
|
|
116
|
-
onPropertyDeclare(component, property, component[property]);
|
|
117
|
-
Object.defineProperty(component, property, {
|
|
118
|
-
set(value) {
|
|
119
|
-
/**
|
|
120
|
-
* Call setter.
|
|
121
|
-
*/
|
|
122
|
-
onPropertySet(component, property, value);
|
|
123
|
-
},
|
|
124
|
-
get() {
|
|
125
|
-
/**
|
|
126
|
-
* Call getter.
|
|
127
|
-
*/
|
|
128
|
-
return onPropertyGet(component, property);
|
|
129
|
-
},
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
return component;
|
|
133
|
-
});
|
|
134
|
-
/**
|
|
135
|
-
* Override factory with the newly decorated one.
|
|
136
|
-
*/
|
|
137
|
-
Object.defineProperty(componentType, 'ɵfac', {
|
|
138
|
-
get() {
|
|
139
|
-
return factory;
|
|
140
|
-
},
|
|
141
|
-
});
|
|
142
|
-
/**
|
|
143
|
-
* Link hooks.
|
|
144
|
-
*/
|
|
145
|
-
_spyOnMethod(componentType, 'ngOnInit', onInit);
|
|
146
|
-
_spyOnMethod(componentType, 'ngOnDestroy', onDestroy);
|
|
147
|
-
}
|
|
148
|
-
function _spyOnMethod(klass, methodName, callback) {
|
|
149
|
-
const proto = klass.prototype;
|
|
150
|
-
proto[methodName] = _decorate(proto[methodName], (wrappedMethod) => {
|
|
151
|
-
return function () {
|
|
152
|
-
var _a;
|
|
153
|
-
callback(this);
|
|
154
|
-
return (_a = wrappedMethod === null || wrappedMethod === void 0 ? void 0 : wrappedMethod.bind(this)) === null || _a === void 0 ? void 0 : _a();
|
|
155
|
-
};
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
159
|
-
function _decorate(fn, decorator) {
|
|
160
|
-
return decorator(fn);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function applyStrategy(componentType, strategy) {
|
|
164
|
-
_bindComponentToEngine(componentType, {
|
|
165
|
-
onCreate(component) {
|
|
166
|
-
strategy(getStrategyDevKit(component));
|
|
167
|
-
},
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
function _bindComponentToEngine(componentType, { onCreate }) {
|
|
171
|
-
decorateComponent(componentType, {
|
|
172
|
-
onCreate(component, changeDetectionFns) {
|
|
173
|
-
getEngine(component).setChangeDetectionFns(changeDetectionFns);
|
|
174
|
-
onCreate(component);
|
|
175
|
-
},
|
|
176
|
-
onInit(component) {
|
|
177
|
-
getEngine(component).markInitialized();
|
|
178
|
-
},
|
|
179
|
-
onDestroy(component) {
|
|
180
|
-
getEngine(component).markDestroyed();
|
|
181
|
-
},
|
|
182
|
-
onPropertyDeclare(component, property, value) {
|
|
183
|
-
getEngine(component).setProperty(property, value);
|
|
184
|
-
},
|
|
185
|
-
onPropertyGet(component, property) {
|
|
186
|
-
return getEngine(component).getProperty(property);
|
|
187
|
-
},
|
|
188
|
-
onPropertySet(component, property, value) {
|
|
189
|
-
getEngine(component).setProperty(property, value);
|
|
190
|
-
},
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Creates a change detection strategy which is local to the component.
|
|
196
|
-
* It implements optional coalescing which can be customized using `coalescer` parameter.
|
|
197
|
-
*
|
|
198
|
-
* @example createLocalStrategy()
|
|
199
|
-
* @example createLocalStrategy({coalescer: audit(() => Promise.resolve())})
|
|
200
|
-
*
|
|
201
|
-
* @returns a strategy that can be used with Microwave decorator.
|
|
202
|
-
*/
|
|
203
|
-
const createLocalStrategy = ({ coalescer, } = {}) => ({ initialized$, changed$, destroyed$, detach, detectChanges }) => {
|
|
204
|
-
/**
|
|
205
|
-
* Detach change detection as we want to take control.
|
|
206
|
-
*/
|
|
207
|
-
detach();
|
|
208
|
-
/**
|
|
209
|
-
* Trigger change detection initially and on property changes.
|
|
210
|
-
* Coalesce through micro-tasks.
|
|
211
|
-
*/
|
|
212
|
-
let source$ = concat(initialized$, changed$);
|
|
213
|
-
if (coalescer != null) {
|
|
214
|
-
source$ = source$.pipe(coalescer);
|
|
215
|
-
}
|
|
216
|
-
source$.pipe(takeUntil(destroyed$)).subscribe(() => detectChanges());
|
|
217
|
-
};
|
|
218
|
-
|
|
219
|
-
const syncStrategy = createLocalStrategy();
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* A strategy that coalesces changes using microtask scheduling.
|
|
223
|
-
*/
|
|
224
|
-
const asapStrategy = createLocalStrategy({
|
|
225
|
-
coalescer: audit(() => Promise.resolve()),
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* A strategy that coalesces changes using macrotask scheduling.
|
|
230
|
-
*/
|
|
231
|
-
const asyncStrategy = createLocalStrategy({
|
|
232
|
-
coalescer: audit(() => timer(0)),
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* A strategy that coalesces changes using requestAnimationFrame scheduler.
|
|
237
|
-
*/
|
|
238
|
-
const rafStrategy = createLocalStrategy({
|
|
239
|
-
coalescer: audit(() => animationFrames()),
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
function Microwave({ strategy = asapStrategy } = {}) {
|
|
243
|
-
return function MicrowaveDecorator(componentType) {
|
|
244
|
-
applyStrategy(componentType, strategy);
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
function watch(component, property) {
|
|
248
|
-
const { destroyed$, watchProperty } = getEngine(component);
|
|
249
|
-
return watchProperty(property).pipe(takeUntil(destroyed$));
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Generated bundle index. Do not edit.
|
|
254
|
-
*/
|
|
255
|
-
|
|
256
|
-
export { Microwave, asapStrategy, asyncStrategy, createLocalStrategy, rafStrategy, syncStrategy, watch };
|
|
257
|
-
//# sourceMappingURL=jscutlery-microwave.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jscutlery-microwave.mjs","sources":["../../../../packages/microwave/src/lib/core/engine.ts","../../../../packages/microwave/src/lib/devkit.ts","../../../../packages/microwave/src/lib/shared/decorator.ts","../../../../packages/microwave/src/lib/apply-strategy.ts","../../../../packages/microwave/src/lib/strategies/local.ts","../../../../packages/microwave/src/lib/strategies/sync.ts","../../../../packages/microwave/src/lib/strategies/asap.ts","../../../../packages/microwave/src/lib/strategies/async.ts","../../../../packages/microwave/src/lib/strategies/raf.ts","../../../../packages/microwave/src/lib/microwave.ts","../../../../packages/microwave/src/jscutlery-microwave.ts"],"sourcesContent":["import {\n BehaviorSubject,\n map,\n mapTo,\n Observable,\n ReplaySubject,\n take,\n} from 'rxjs';\nimport { ChangeDetectionFns } from './change-detection-fns';\n\n/**\n * This should stay decoupled from Angular.\n *\n * @param component an instance of anything\n * @returns an set of methods and observables that respectively\n * control and represent the state of the object.\n */\nexport function getEngine<COMPONENT, K extends keyof COMPONENT = keyof COMPONENT>(\n component: COMPONENT\n): MicrowaveEngine<COMPONENT, K> {\n /* Memoize engine. */\n const microwavedComponent = component as Microwaved<COMPONENT>;\n const engine = microwavedComponent[_ENGINE_SYMBOL];\n if (engine != null) {\n return engine;\n }\n\n const destroyed$ = new ReplaySubject<void>(1);\n const initialized$ = new ReplaySubject<void>(1);\n const state$ = new BehaviorSubject<Partial<COMPONENT>>({});\n let changeDetectionFns: ChangeDetectionFns;\n\n return (microwavedComponent[_ENGINE_SYMBOL] = {\n destroyed$: destroyed$.pipe(take(1)),\n initialized$: initialized$.pipe(take(1)),\n changed$: state$.pipe(mapTo(undefined)),\n detach() {\n changeDetectionFns.detach();\n },\n detectChanges() {\n changeDetectionFns.detectChanges();\n },\n markDestroyed() {\n destroyed$.next();\n },\n markInitialized() {\n initialized$.next();\n },\n setChangeDetectionFns(_changeDetectionFns: ChangeDetectionFns) {\n changeDetectionFns = _changeDetectionFns;\n },\n getProperty(property) {\n return state$.value[property];\n },\n setProperty(property, value) {\n /* Don't set value if it didn't change.\n * This is more performant than `distinctUntilChanged` all over the place. */\n if (state$.value[property] === value) {\n return;\n }\n\n state$.next({ ...state$.value, [property]: value });\n },\n watchProperty(property) {\n return state$.pipe(map((state) => state[property]));\n },\n });\n}\n\nexport const _ENGINE_SYMBOL = Symbol('MicrowaveEngine');\n\nexport type Microwaved<T, K extends keyof T = keyof T> = T & {\n [_ENGINE_SYMBOL]?: MicrowaveEngine<T, K>;\n};\n\nexport interface MicrowaveEngine<T, K extends keyof T> {\n /**\n * Functions below form the strategy facade.\n */\n destroyed$: Observable<void>;\n /* Tells when component is initialized (ngOnInit). */\n initialized$: Observable<void>;\n /* Tells if some property changed. */\n changed$: Observable<void>;\n detach(): void;\n detectChanges(): void;\n\n /**\n * Functions below are used to bind with component.\n */\n setChangeDetectionFns(changeDetectionFns: ChangeDetectionFns): void;\n markDestroyed(): void;\n markInitialized(): void;\n getProperty<PROP extends K>(property: PROP): T[PROP] | undefined;\n setProperty<PROP extends K>(property: PROP, value: T[PROP]): void;\n watchProperty<PROP extends K>(\n property: PROP\n ): Observable<T[PROP] | undefined>;\n}\n\nexport type MicrowaveSubjectsMap<T, K extends keyof T> = Map<\n K,\n BehaviorSubject<T[K]>\n>;\n\nexport function _getPropertySubject<T, K extends keyof T, PROP extends K>(\n subjectsMap: MicrowaveSubjectsMap<T, K>,\n property: PROP\n): BehaviorSubject<T[PROP]> {\n let subject = subjectsMap.get(property);\n\n if (subject == null) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n subject = new BehaviorSubject(undefined as any);\n subjectsMap.set(property, subject);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return subject as any;\n}\n","import { getEngine, MicrowaveEngine } from './core/engine';\n\nexport function getStrategyDevKit<COMPONENT, K extends keyof COMPONENT = keyof COMPONENT>(\n component: COMPONENT\n): StrategyDevKit<COMPONENT, K> {\n const { changed$, destroyed$, initialized$, detach, detectChanges } =\n getEngine(component);\n return { changed$, destroyed$, initialized$, detach, detectChanges };\n}\n\nexport type StrategyDevKit<T, K extends keyof T = keyof T> = Pick<\n MicrowaveEngine<T, K>,\n 'changed$' | 'destroyed$' | 'initialized$' | 'detach' | 'detectChanges'\n>;\n\nexport type Strategy<T> = (strategyDevKit: StrategyDevKit<T>) => void;\n","import { ChangeDetectorRef, Type, ɵɵdirectiveInject } from '@angular/core';\nimport { ChangeDetectionFns } from '../core/change-detection-fns';\n\n/**\n * Decorate Angular components with custom hooks.\n *\n * @param componentType the component class to decorate.\n * @param hooks\n */\nexport function decorateComponent<T, K extends keyof T = keyof T>(\n componentType: IvyComponentType<T>,\n hooks: DecoratorHooks<T>\n) {\n const {\n onCreate,\n onInit,\n onDestroy,\n onPropertyDeclare,\n onPropertyGet,\n onPropertySet,\n } = hooks;\n\n if (!componentType.ɵfac) {\n throw new Error(\n `${componentType.name} is either not a component or not compiled.`\n );\n }\n\n /**\n * Override component factory.\n */\n const factory = _decorate(\n componentType.ɵfac,\n /*\n * Override getters & setters.\n */\n (factoryFn: () => T) => () => {\n /* Grab change detector to control it. */\n const cdr = ɵɵdirectiveInject(ChangeDetectorRef);\n\n const component = factoryFn();\n\n /**\n * Notify about creation.\n */\n onCreate(component, {\n detach() {\n cdr.detach();\n },\n detectChanges() {\n cdr.detectChanges();\n },\n });\n\n /**\n * This will only list initialized properties.\n * That's the reason why all properties should be initialized\n * when using Microwave.\n */\n for (const property of Object.getOwnPropertyNames(\n component\n ) as Array<K>) {\n /**\n * Notify when property is discovered.\n */\n onPropertyDeclare(component, property, component[property]);\n\n Object.defineProperty(component, property, {\n set(value) {\n /**\n * Call setter.\n */\n onPropertySet(component, property, value);\n },\n get() {\n /**\n * Call getter.\n */\n return onPropertyGet(component, property);\n },\n });\n }\n\n return component;\n }\n );\n\n /**\n * Override factory with the newly decorated one.\n */\n Object.defineProperty(componentType, 'ɵfac', {\n get() {\n return factory;\n },\n });\n\n /**\n * Link hooks.\n */\n _spyOnMethod(componentType, 'ngOnInit', onInit);\n _spyOnMethod(componentType, 'ngOnDestroy', onDestroy);\n}\n\nexport interface DecoratorHooks<T, K extends keyof T = keyof T> {\n /**\n * Hook called when a new component is created.\n *\n * @param component the created component.\n * @param args change detection functions for controlling change detection.\n */\n onCreate(component: T, args: ChangeDetectionFns): void;\n\n /**\n * Hook called when a new component is initialized.\n *\n * @param component the created component.\n */\n onInit(component: T): void;\n\n /**\n * Hook called just before the real ngOnDestroy (if implemented) is called.\n */\n onDestroy(component: T): void;\n\n /**\n * Hook called when a property is discovered.\n * This is the opportunity to grab the initial value before\n * the property is replaced by getters and setters.\n */\n onPropertyDeclare(component: T, property: K, value: T[K]): void;\n\n /**\n * Hook called to retrieve a property.\n */\n onPropertyGet(component: T, property: K): T[K] | undefined;\n\n /**\n * Hook called to set a property.\n */\n onPropertySet(component: T, property: K, value: T[K]): void;\n}\n\nexport interface IvyComponentType<T> extends Type<T> {\n ɵfac?: () => T;\n}\n\nexport function _spyOnMethod<T>(\n klass: Type<T>,\n methodName: string,\n callback: (instance: T) => void\n) {\n const proto = klass.prototype;\n proto[methodName] = _decorate(\n proto[methodName],\n (wrappedMethod: () => void) => {\n return function (this: T) {\n callback(this);\n return wrappedMethod?.bind(this)?.();\n };\n }\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _decorate<F extends (...args: any[]) => any>(\n fn: F,\n decorator: (fn: F) => F\n) {\n return decorator(fn);\n}\n","import { getEngine } from './core/engine';\nimport { getStrategyDevKit, Strategy } from './devkit';\nimport { decorateComponent, IvyComponentType } from './shared/decorator';\n\nexport function applyStrategy<T>(\n componentType: IvyComponentType<T>,\n strategy: Strategy<T>\n) {\n _bindComponentToEngine(componentType, {\n onCreate(component) {\n strategy(getStrategyDevKit(component));\n },\n });\n}\n\nexport function _bindComponentToEngine<T>(\n componentType: IvyComponentType<T>,\n { onCreate }: { onCreate: (component: T) => void }\n) {\n decorateComponent(componentType, {\n onCreate(component, changeDetectionFns) {\n getEngine(component).setChangeDetectionFns(changeDetectionFns);\n onCreate(component);\n },\n onInit(component) {\n getEngine(component).markInitialized();\n },\n onDestroy(component) {\n getEngine(component).markDestroyed();\n },\n onPropertyDeclare(component, property, value) {\n getEngine(component).setProperty(property, value);\n },\n onPropertyGet(component, property) {\n return getEngine(component).getProperty(property);\n },\n onPropertySet(component, property, value) {\n getEngine(component).setProperty(property, value);\n },\n });\n}\n","import { concat, MonoTypeOperatorFunction, takeUntil } from 'rxjs';\nimport { Strategy } from '../devkit';\n\n/**\n * Creates a change detection strategy which is local to the component.\n * It implements optional coalescing which can be customized using `coalescer` parameter.\n *\n * @example createLocalStrategy()\n * @example createLocalStrategy({coalescer: audit(() => Promise.resolve())})\n *\n * @returns a strategy that can be used with Microwave decorator.\n */\nexport const createLocalStrategy =\n ({\n coalescer,\n }: { coalescer?: MonoTypeOperatorFunction<void> } = {}): Strategy<unknown> =>\n ({ initialized$, changed$, destroyed$, detach, detectChanges }) => {\n /**\n * Detach change detection as we want to take control.\n */\n detach();\n\n /**\n * Trigger change detection initially and on property changes.\n * Coalesce through micro-tasks.\n */\n let source$ = concat(initialized$, changed$);\n\n if (coalescer != null) {\n source$ = source$.pipe(coalescer);\n }\n\n source$.pipe(takeUntil(destroyed$)).subscribe(() => detectChanges());\n };\n","import { createLocalStrategy } from './local';\nimport { Strategy } from '../devkit';\n\nexport const syncStrategy: Strategy<unknown> = createLocalStrategy();\n","import { audit } from 'rxjs';\nimport { Strategy } from '../devkit';\nimport { createLocalStrategy } from './local';\n\n/**\n * A strategy that coalesces changes using microtask scheduling.\n */\nexport const asapStrategy: Strategy<unknown> = createLocalStrategy({\n coalescer: audit(() => Promise.resolve()),\n});\n","import { audit, timer } from 'rxjs';\nimport { Strategy } from '../devkit';\nimport { createLocalStrategy } from './local';\n\n/**\n * A strategy that coalesces changes using macrotask scheduling.\n */\nexport const asyncStrategy: Strategy<unknown> = createLocalStrategy({\n coalescer: audit(() => timer(0)),\n});\n","import { audit, animationFrames } from 'rxjs';\nimport { Strategy } from '../devkit';\nimport { createLocalStrategy } from './local';\n\n/**\n * A strategy that coalesces changes using requestAnimationFrame scheduler.\n */\nexport const rafStrategy: Strategy<unknown> = createLocalStrategy({\n coalescer: audit(() => animationFrames()),\n});\n","import { Observable, takeUntil } from 'rxjs';\nimport { applyStrategy } from './apply-strategy';\nimport { getEngine } from './core/engine';\nimport { IvyComponentType } from './shared/decorator';\nimport { asapStrategy } from './strategies';\n\nexport function Microwave({ strategy = asapStrategy } = {}) {\n return function MicrowaveDecorator<T>(componentType: IvyComponentType<T>) {\n applyStrategy(componentType, strategy);\n };\n}\n\nexport function watch<COMPONENT, K extends keyof COMPONENT = keyof COMPONENT>(\n component: COMPONENT,\n property: K\n): Observable<COMPONENT[K] | undefined> {\n const { destroyed$, watchProperty } = getEngine(component);\n return watchProperty(property).pipe(takeUntil(destroyed$));\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|