@jscutlery/microwave 0.1.0
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/README.md +112 -0
- package/esm2020/index.mjs +3 -0
- package/esm2020/jscutlery-microwave.mjs +5 -0
- package/esm2020/lib/apply-strategy.mjs +34 -0
- package/esm2020/lib/core/change-detection-fns.mjs +2 -0
- package/esm2020/lib/core/engine.mjs +65 -0
- package/esm2020/lib/devkit.mjs +6 -0
- package/esm2020/lib/microwave.mjs +14 -0
- package/esm2020/lib/shared/decorator.mjs +89 -0
- package/esm2020/lib/strategies/asap.mjs +9 -0
- package/esm2020/lib/strategies/async.mjs +9 -0
- package/esm2020/lib/strategies/index.mjs +6 -0
- package/esm2020/lib/strategies/local.mjs +26 -0
- package/esm2020/lib/strategies/raf.mjs +9 -0
- package/esm2020/lib/strategies/sync.mjs +3 -0
- package/fesm2015/jscutlery-microwave.mjs +256 -0
- package/fesm2015/jscutlery-microwave.mjs.map +1 -0
- package/fesm2020/jscutlery-microwave.mjs +255 -0
- package/fesm2020/jscutlery-microwave.mjs.map +1 -0
- package/index.d.ts +3 -0
- package/jscutlery-microwave.d.ts +5 -0
- package/lib/apply-strategy.d.ts +6 -0
- package/lib/core/change-detection-fns.d.ts +10 -0
- package/lib/core/engine.d.ts +35 -0
- package/lib/devkit.d.ts +4 -0
- package/lib/microwave.d.ts +6 -0
- package/lib/shared/decorator.d.ts +47 -0
- package/lib/strategies/asap.d.ts +5 -0
- package/lib/strategies/async.d.ts +5 -0
- package/lib/strategies/index.d.ts +5 -0
- package/lib/strategies/local.d.ts +14 -0
- package/lib/strategies/raf.d.ts +5 -0
- package/lib/strategies/sync.d.ts +2 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Microwave
|
|
2
|
+
|
|
3
|
+
`@jscutlery/microwave` brings simplified and performant reactivity to Angular.
|
|
4
|
+
|
|
5
|
+
# 🪄 Features
|
|
6
|
+
|
|
7
|
+
⚡️ Less change detection: Microwave will only trigger change detection when properties change.
|
|
8
|
+
|
|
9
|
+
😌 Less RxJS Spaghetti: Focus on your features without sacrificing performance.
|
|
10
|
+
|
|
11
|
+
🚦 Coalescing: regroup changes and trigger change detection once per component.
|
|
12
|
+
|
|
13
|
+
✅ Microwave is ZoneJS agnostic so it will work with or without it.
|
|
14
|
+
|
|
15
|
+
👯♀️ Don't trigger useless change detections when a property's value has been set to the same value.
|
|
16
|
+
|
|
17
|
+
# Table of Contents
|
|
18
|
+
|
|
19
|
+
- [Microwave](#microwave)
|
|
20
|
+
- [🪄 Features](#-features)
|
|
21
|
+
- [Table of Contents](#table-of-contents)
|
|
22
|
+
- [📝 Usage](#-usage)
|
|
23
|
+
- [`@Microwave`](#microwave-1)
|
|
24
|
+
- [`@Microwave` + `watch`](#microwave--watch)
|
|
25
|
+
- [Change detection strategies](#change-detection-strategies)
|
|
26
|
+
- [Custom strategies.](#custom-strategies)
|
|
27
|
+
- [Upcoming features](#upcoming-features)
|
|
28
|
+
- [Acknowledgements](#acknowledgements)
|
|
29
|
+
- [Nuke it](#nuke-it)
|
|
30
|
+
|
|
31
|
+
# 📝 Usage
|
|
32
|
+
|
|
33
|
+
## `@Microwave`
|
|
34
|
+
|
|
35
|
+
Just add the `@Microwave` decorator and let it [nuke](#nuke-it) your component!
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { Microwave } from '@jscutlery/microwave';
|
|
39
|
+
|
|
40
|
+
@Microwave()
|
|
41
|
+
@Component({
|
|
42
|
+
template: `...`,
|
|
43
|
+
})
|
|
44
|
+
class GreetingsComponent {
|
|
45
|
+
/* ⚠️ Important: properties should be initialized, otherwise they won't be detected by Microwave. */
|
|
46
|
+
name?: string = undefined;
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## `@Microwave` + `watch`
|
|
51
|
+
|
|
52
|
+
Watch property changes.
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
@Microwave()
|
|
56
|
+
@Component({
|
|
57
|
+
template: `<h1>Welcome {{ upperCaseName }}</h1>`,
|
|
58
|
+
})
|
|
59
|
+
class GreetingsComponent {
|
|
60
|
+
@Input() name?: string = undefined;
|
|
61
|
+
upperCaseName?: string = undefined;
|
|
62
|
+
|
|
63
|
+
constructor() {
|
|
64
|
+
/* Note that you don't have to handle the subscription as the returned observable
|
|
65
|
+
* will be unsubscribed from when the component is destroyed.
|
|
66
|
+
* Though, if you add operators, you will have to handle subscriptions. */
|
|
67
|
+
watch(this, 'name').subscribe((name) => {
|
|
68
|
+
this.upperCaseName = name.toUpperCase();
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Change detection strategies
|
|
75
|
+
|
|
76
|
+
You can customize the change detection strategy using the `strategy` parameter.
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
@Microwave({
|
|
80
|
+
strategy: asyncStrategy,
|
|
81
|
+
})
|
|
82
|
+
export class MyComponent {}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Here are the current strategies.
|
|
86
|
+
|
|
87
|
+
### Custom strategies.
|
|
88
|
+
|
|
89
|
+
You can implement your own strategy using the `Strategy<T>` signature.
|
|
90
|
+
|
|
91
|
+
| Strategy | Description |
|
|
92
|
+
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
93
|
+
| asapStrategy | This is the default strategy. It will trigger change detection independently for each component while coalescing changes and scheduling the change detection on the microtask queue. |
|
|
94
|
+
| asyncStrategy | Local strategy coalescing using macrotasks |
|
|
95
|
+
| rafStrategy | Local strategy coalescing using `requestAnimationFrame` |
|
|
96
|
+
| syncStrategy | Local strategy without coalescing so it will trigger change detection each time a property changes. |
|
|
97
|
+
|
|
98
|
+
## Upcoming features
|
|
99
|
+
|
|
100
|
+
- [ ] provide multiple Microwave strategies
|
|
101
|
+
- [ ] `watch` multiple properties
|
|
102
|
+
- [ ] automatically unsubscribe even when using operators with `watch(...).pipe(...)`
|
|
103
|
+
|
|
104
|
+
# Acknowledgements
|
|
105
|
+
|
|
106
|
+
The [RxAngular](https://github.com/rx-angular/rx-angular) team for the inspiration. In fact, the first prototype was built during the creation of the RxState Marmicode Tasting video: https://youtu.be/CcQYj4V2IKw
|
|
107
|
+
|
|
108
|
+
## Nuke it
|
|
109
|
+
|
|
110
|
+
Wordplay by [@AlyssaNicoll](https://twitter.com/AlyssaNicoll) & [@schwarty](https://twitter.com/schwarty).
|
|
111
|
+
|
|
112
|
+
Cf. Angular Air [https://youtu.be/CmspcYY6jjU](https://youtu.be/CmspcYY6jjU)
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { Microwave, watch } from './lib/microwave';
|
|
2
|
+
export { asapStrategy, asyncStrategy, createLocalStrategy, rafStrategy, syncStrategy, } from './lib/strategies';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taWNyb3dhdmUvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxZQUFZLEdBQ2IsTUFBTSxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFN0cmF0ZWd5LCBTdHJhdGVneURldktpdCB9IGZyb20gJy4vbGliL2RldmtpdCc7XG5leHBvcnQgeyBNaWNyb3dhdmUsIHdhdGNoIH0gZnJvbSAnLi9saWIvbWljcm93YXZlJztcbmV4cG9ydCB7XG4gIGFzYXBTdHJhdGVneSxcbiAgYXN5bmNTdHJhdGVneSxcbiAgY3JlYXRlTG9jYWxTdHJhdGVneSxcbiAgcmFmU3RyYXRlZ3ksXG4gIHN5bmNTdHJhdGVneSxcbn0gZnJvbSAnLi9saWIvc3RyYXRlZ2llcyc7XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNjdXRsZXJ5LW1pY3Jvd2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pY3Jvd2F2ZS9zcmMvanNjdXRsZXJ5LW1pY3Jvd2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { getEngine } from './core/engine';
|
|
2
|
+
import { getStrategyDevKit } from './devkit';
|
|
3
|
+
import { decorateComponent } from './shared/decorator';
|
|
4
|
+
export function applyStrategy(componentType, strategy) {
|
|
5
|
+
_bindComponentToEngine(componentType, {
|
|
6
|
+
onCreate(component) {
|
|
7
|
+
strategy(getStrategyDevKit(component));
|
|
8
|
+
},
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export function _bindComponentToEngine(componentType, { onCreate }) {
|
|
12
|
+
decorateComponent(componentType, {
|
|
13
|
+
onCreate(component, changeDetectionFns) {
|
|
14
|
+
getEngine(component).setChangeDetectionFns(changeDetectionFns);
|
|
15
|
+
onCreate(component);
|
|
16
|
+
},
|
|
17
|
+
onInit(component) {
|
|
18
|
+
getEngine(component).markInitialized();
|
|
19
|
+
},
|
|
20
|
+
onDestroy(component) {
|
|
21
|
+
getEngine(component).markDestroyed();
|
|
22
|
+
},
|
|
23
|
+
onPropertyDeclare(component, property, value) {
|
|
24
|
+
getEngine(component).setProperty(property, value);
|
|
25
|
+
},
|
|
26
|
+
onPropertyGet(component, property) {
|
|
27
|
+
return getEngine(component).getProperty(property);
|
|
28
|
+
},
|
|
29
|
+
onPropertySet(component, property, value) {
|
|
30
|
+
getEngine(component).setProperty(property, value);
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taWNyb3dhdmUvc3JjL2xpYi9hcHBseS1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBWSxNQUFNLFVBQVUsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQW9CLE1BQU0sb0JBQW9CLENBQUM7QUFFekUsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsYUFBa0MsRUFDbEMsUUFBcUI7SUFFckIsc0JBQXNCLENBQUMsYUFBYSxFQUFFO1FBQ3BDLFFBQVEsQ0FBQyxTQUFTO1lBQ2hCLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxhQUFrQyxFQUNsQyxFQUFFLFFBQVEsRUFBd0M7SUFFbEQsaUJBQWlCLENBQUMsYUFBYSxFQUFFO1FBQy9CLFFBQVEsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCO1lBQ3BDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQy9ELFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsTUFBTSxDQUFDLFNBQVM7WUFDZCxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekMsQ0FBQztRQUNELFNBQVMsQ0FBQyxTQUFTO1lBQ2pCLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLO1lBQzFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVE7WUFDL0IsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLO1lBQ3RDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RW5naW5lIH0gZnJvbSAnLi9jb3JlL2VuZ2luZSc7XG5pbXBvcnQgeyBnZXRTdHJhdGVneURldktpdCwgU3RyYXRlZ3kgfSBmcm9tICcuL2RldmtpdCc7XG5pbXBvcnQgeyBkZWNvcmF0ZUNvbXBvbmVudCwgSXZ5Q29tcG9uZW50VHlwZSB9IGZyb20gJy4vc2hhcmVkL2RlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVN0cmF0ZWd5PFQ+KFxuICBjb21wb25lbnRUeXBlOiBJdnlDb21wb25lbnRUeXBlPFQ+LFxuICBzdHJhdGVneTogU3RyYXRlZ3k8VD5cbikge1xuICBfYmluZENvbXBvbmVudFRvRW5naW5lKGNvbXBvbmVudFR5cGUsIHtcbiAgICBvbkNyZWF0ZShjb21wb25lbnQpIHtcbiAgICAgIHN0cmF0ZWd5KGdldFN0cmF0ZWd5RGV2S2l0KGNvbXBvbmVudCkpO1xuICAgIH0sXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2JpbmRDb21wb25lbnRUb0VuZ2luZTxUPihcbiAgY29tcG9uZW50VHlwZTogSXZ5Q29tcG9uZW50VHlwZTxUPixcbiAgeyBvbkNyZWF0ZSB9OiB7IG9uQ3JlYXRlOiAoY29tcG9uZW50OiBUKSA9PiB2b2lkIH1cbikge1xuICBkZWNvcmF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlLCB7XG4gICAgb25DcmVhdGUoY29tcG9uZW50LCBjaGFuZ2VEZXRlY3Rpb25GbnMpIHtcbiAgICAgIGdldEVuZ2luZShjb21wb25lbnQpLnNldENoYW5nZURldGVjdGlvbkZucyhjaGFuZ2VEZXRlY3Rpb25GbnMpO1xuICAgICAgb25DcmVhdGUoY29tcG9uZW50KTtcbiAgICB9LFxuICAgIG9uSW5pdChjb21wb25lbnQpIHtcbiAgICAgIGdldEVuZ2luZShjb21wb25lbnQpLm1hcmtJbml0aWFsaXplZCgpO1xuICAgIH0sXG4gICAgb25EZXN0cm95KGNvbXBvbmVudCkge1xuICAgICAgZ2V0RW5naW5lKGNvbXBvbmVudCkubWFya0Rlc3Ryb3llZCgpO1xuICAgIH0sXG4gICAgb25Qcm9wZXJ0eURlY2xhcmUoY29tcG9uZW50LCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICAgIGdldEVuZ2luZShjb21wb25lbnQpLnNldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBvblByb3BlcnR5R2V0KGNvbXBvbmVudCwgcHJvcGVydHkpIHtcbiAgICAgIHJldHVybiBnZXRFbmdpbmUoY29tcG9uZW50KS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7XG4gICAgfSxcbiAgICBvblByb3BlcnR5U2V0KGNvbXBvbmVudCwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgICBnZXRFbmdpbmUoY29tcG9uZW50KS5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLWRldGVjdGlvbi1mbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taWNyb3dhdmUvc3JjL2xpYi9jb3JlL2NoYW5nZS1kZXRlY3Rpb24tZm5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFuIGFsdGVybmF0aXZlIHRvIENoYW5nZURldGVjdG9yUmVmIHRvIHN0YXkgbG9vc2VseSBjb3VwbGVkLlxuICogUGx1cywgdGhpcyBmdW5jdGlvbnMgY2FuIGJlIGRlc3RydWN0dXJlZCBhcyB0aGV5IGRvbid0IHVzZSBgdGhpc2AuXG4gKiBMZXQncyB0cnkgdG8gcmVkdWNlIHRoZSBzdXJmYWNlIGFuZCBub3QgZXhwb3NlIGFsbCBmdW5jdGlvbnNcbiAqIGlmIHdlIGRvbid0IG5lZWQgdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VEZXRlY3Rpb25GbnMge1xuICBkZXRhY2goKTogdm9pZDtcbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkO1xufVxuIl19
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { BehaviorSubject, map, mapTo, ReplaySubject, take, } from 'rxjs';
|
|
2
|
+
/**
|
|
3
|
+
* This should stay decoupled from Angular.
|
|
4
|
+
*
|
|
5
|
+
* @param component an instance of anything
|
|
6
|
+
* @returns an set of methods and observables that respectively
|
|
7
|
+
* control and represent the state of the object.
|
|
8
|
+
*/
|
|
9
|
+
export function getEngine(component) {
|
|
10
|
+
/* Memoize engine. */
|
|
11
|
+
const engine = component[_ENGINE_SYMBOL];
|
|
12
|
+
if (engine != null) {
|
|
13
|
+
return engine;
|
|
14
|
+
}
|
|
15
|
+
const destroyed$ = new ReplaySubject(1);
|
|
16
|
+
const initialized$ = new ReplaySubject(1);
|
|
17
|
+
const state$ = new BehaviorSubject({});
|
|
18
|
+
let changeDetectionFns;
|
|
19
|
+
return (component[_ENGINE_SYMBOL] = {
|
|
20
|
+
destroyed$: destroyed$.pipe(take(1)),
|
|
21
|
+
initialized$: initialized$.pipe(take(1)),
|
|
22
|
+
changed$: state$.pipe(mapTo(undefined)),
|
|
23
|
+
detach() {
|
|
24
|
+
changeDetectionFns.detach();
|
|
25
|
+
},
|
|
26
|
+
detectChanges() {
|
|
27
|
+
changeDetectionFns.detectChanges();
|
|
28
|
+
},
|
|
29
|
+
markDestroyed() {
|
|
30
|
+
destroyed$.next();
|
|
31
|
+
},
|
|
32
|
+
markInitialized() {
|
|
33
|
+
initialized$.next();
|
|
34
|
+
},
|
|
35
|
+
setChangeDetectionFns(_changeDetectionFns) {
|
|
36
|
+
changeDetectionFns = _changeDetectionFns;
|
|
37
|
+
},
|
|
38
|
+
getProperty(property) {
|
|
39
|
+
return state$.value[property];
|
|
40
|
+
},
|
|
41
|
+
setProperty(property, value) {
|
|
42
|
+
/* Don't set value if it didn't change.
|
|
43
|
+
* This is more performant than `distinctUntilChanged` all over the place. */
|
|
44
|
+
if (state$.value[property] === value) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
state$.next({ ...state$.value, [property]: value });
|
|
48
|
+
},
|
|
49
|
+
watchProperty(property) {
|
|
50
|
+
return state$.pipe(map((state) => state[property]));
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export const _ENGINE_SYMBOL = Symbol('MicrowaveEngine');
|
|
55
|
+
export function _getPropertySubject(subjectsMap, property) {
|
|
56
|
+
let subject = subjectsMap.get(property);
|
|
57
|
+
if (subject == null) {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
+
subject = new BehaviorSubject(undefined);
|
|
60
|
+
subjectsMap.set(property, subject);
|
|
61
|
+
}
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
return subject;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWljcm93YXZlL3NyYy9saWIvY29yZS9lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGVBQWUsRUFDZixHQUFHLEVBQ0gsS0FBSyxFQUVMLGFBQWEsRUFDYixJQUFJLEdBQ0wsTUFBTSxNQUFNLENBQUM7QUFHZDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUN2QixTQUEyQjtJQUUzQixxQkFBcUI7SUFDckIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtRQUNsQixPQUFPLE1BQU0sQ0FBQztLQUNmO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxhQUFhLENBQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFhLENBQU8sQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQWEsRUFBRSxDQUFDLENBQUM7SUFDbkQsSUFBSSxrQkFBc0MsQ0FBQztJQUUzQyxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHO1FBQ2xDLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxZQUFZLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU07WUFDSixrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBQ0QsYUFBYTtZQUNYLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxhQUFhO1lBQ1gsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxlQUFlO1lBQ2IsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxxQkFBcUIsQ0FBQyxtQkFBdUM7WUFDM0Qsa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7UUFDM0MsQ0FBQztRQUNELFdBQVcsQ0FBQyxRQUFRO1lBQ2xCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsV0FBVyxDQUFDLFFBQVEsRUFBRSxLQUFLO1lBQ3pCO3lGQUM2RTtZQUM3RSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUNwQyxPQUFPO2FBQ1I7WUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsYUFBYSxDQUFDLFFBQVE7WUFDcEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQW9DeEQsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxXQUF1QyxFQUN2QyxRQUFjO0lBRWQsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV4QyxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsOERBQThEO1FBQzlELE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxTQUFnQixDQUFDLENBQUM7UUFDaEQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDcEM7SUFFRCw4REFBOEQ7SUFDOUQsT0FBTyxPQUFjLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgbWFwLFxuICBtYXBUbyxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgdGFrZSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25GbnMgfSBmcm9tICcuL2NoYW5nZS1kZXRlY3Rpb24tZm5zJztcblxuLyoqXG4gKiBUaGlzIHNob3VsZCBzdGF5IGRlY291cGxlZCBmcm9tIEFuZ3VsYXIuXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudCBhbiBpbnN0YW5jZSBvZiBhbnl0aGluZ1xuICogQHJldHVybnMgYW4gc2V0IG9mIG1ldGhvZHMgYW5kIG9ic2VydmFibGVzIHRoYXQgcmVzcGVjdGl2ZWx5XG4gKiBjb250cm9sIGFuZCByZXByZXNlbnQgdGhlIHN0YXRlIG9mIHRoZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmdpbmU8VCwgSyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPihcbiAgY29tcG9uZW50OiBNaWNyb3dhdmVkPFQsIEs+XG4pOiBNaWNyb3dhdmVFbmdpbmU8VCwgSz4ge1xuICAvKiBNZW1vaXplIGVuZ2luZS4gKi9cbiAgY29uc3QgZW5naW5lID0gY29tcG9uZW50W19FTkdJTkVfU1lNQk9MXTtcbiAgaWYgKGVuZ2luZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGVuZ2luZTtcbiAgfVxuXG4gIGNvbnN0IGRlc3Ryb3llZCQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcbiAgY29uc3QgaW5pdGlhbGl6ZWQkID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG4gIGNvbnN0IHN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGFydGlhbDxUPj4oe30pO1xuICBsZXQgY2hhbmdlRGV0ZWN0aW9uRm5zOiBDaGFuZ2VEZXRlY3Rpb25GbnM7XG5cbiAgcmV0dXJuIChjb21wb25lbnRbX0VOR0lORV9TWU1CT0xdID0ge1xuICAgIGRlc3Ryb3llZCQ6IGRlc3Ryb3llZCQucGlwZSh0YWtlKDEpKSxcbiAgICBpbml0aWFsaXplZCQ6IGluaXRpYWxpemVkJC5waXBlKHRha2UoMSkpLFxuICAgIGNoYW5nZWQkOiBzdGF0ZSQucGlwZShtYXBUbyh1bmRlZmluZWQpKSxcbiAgICBkZXRhY2goKSB7XG4gICAgICBjaGFuZ2VEZXRlY3Rpb25GbnMuZGV0YWNoKCk7XG4gICAgfSxcbiAgICBkZXRlY3RDaGFuZ2VzKCkge1xuICAgICAgY2hhbmdlRGV0ZWN0aW9uRm5zLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LFxuICAgIG1hcmtEZXN0cm95ZWQoKSB7XG4gICAgICBkZXN0cm95ZWQkLm5leHQoKTtcbiAgICB9LFxuICAgIG1hcmtJbml0aWFsaXplZCgpIHtcbiAgICAgIGluaXRpYWxpemVkJC5uZXh0KCk7XG4gICAgfSxcbiAgICBzZXRDaGFuZ2VEZXRlY3Rpb25GbnMoX2NoYW5nZURldGVjdGlvbkZuczogQ2hhbmdlRGV0ZWN0aW9uRm5zKSB7XG4gICAgICBjaGFuZ2VEZXRlY3Rpb25GbnMgPSBfY2hhbmdlRGV0ZWN0aW9uRm5zO1xuICAgIH0sXG4gICAgZ2V0UHJvcGVydHkocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiBzdGF0ZSQudmFsdWVbcHJvcGVydHldO1xuICAgIH0sXG4gICAgc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7XG4gICAgICAvKiBEb24ndCBzZXQgdmFsdWUgaWYgaXQgZGlkbid0IGNoYW5nZS5cbiAgICAgICAqIFRoaXMgaXMgbW9yZSBwZXJmb3JtYW50IHRoYW4gYGRpc3RpbmN0VW50aWxDaGFuZ2VkYCBhbGwgb3ZlciB0aGUgcGxhY2UuICovXG4gICAgICBpZiAoc3RhdGUkLnZhbHVlW3Byb3BlcnR5XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZSQubmV4dCh7IC4uLnN0YXRlJC52YWx1ZSwgW3Byb3BlcnR5XTogdmFsdWUgfSk7XG4gICAgfSxcbiAgICB3YXRjaFByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gc3RhdGUkLnBpcGUobWFwKChzdGF0ZSkgPT4gc3RhdGVbcHJvcGVydHldKSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBfRU5HSU5FX1NZTUJPTCA9IFN5bWJvbCgnTWljcm93YXZlRW5naW5lJyk7XG5cbmV4cG9ydCB0eXBlIE1pY3Jvd2F2ZWQ8VCwgSyBleHRlbmRzIGtleW9mIFQ+ID0gVCAmIHtcbiAgW19FTkdJTkVfU1lNQk9MXT86IE1pY3Jvd2F2ZUVuZ2luZTxULCBLPjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWljcm93YXZlRW5naW5lPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPiB7XG4gIC8qKlxuICAgKiBGdW5jdGlvbnMgYmVsb3cgZm9ybSB0aGUgc3RyYXRlZ3kgZmFjYWRlLlxuICAgKi9cbiAgZGVzdHJveWVkJDogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgLyogVGVsbHMgd2hlbiBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQgKG5nT25Jbml0KS4gKi9cbiAgaW5pdGlhbGl6ZWQkOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAvKiBUZWxscyBpZiBzb21lIHByb3BlcnR5IGNoYW5nZWQuICovXG4gIGNoYW5nZWQkOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICBkZXRhY2goKTogdm9pZDtcbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgdG8gYmluZCB3aXRoIGNvbXBvbmVudC5cbiAgICovXG4gIHNldENoYW5nZURldGVjdGlvbkZucyhjaGFuZ2VEZXRlY3Rpb25GbnM6IENoYW5nZURldGVjdGlvbkZucyk6IHZvaWQ7XG4gIG1hcmtEZXN0cm95ZWQoKTogdm9pZDtcbiAgbWFya0luaXRpYWxpemVkKCk6IHZvaWQ7XG4gIGdldFByb3BlcnR5PFBST1AgZXh0ZW5kcyBLPihwcm9wZXJ0eTogUFJPUCk6IFRbUFJPUF0gfCB1bmRlZmluZWQ7XG4gIHNldFByb3BlcnR5PFBST1AgZXh0ZW5kcyBLPihwcm9wZXJ0eTogUFJPUCwgdmFsdWU6IFRbUFJPUF0pOiB2b2lkO1xuICB3YXRjaFByb3BlcnR5PFBST1AgZXh0ZW5kcyBLPihcbiAgICBwcm9wZXJ0eTogUFJPUFxuICApOiBPYnNlcnZhYmxlPFRbUFJPUF0gfCB1bmRlZmluZWQ+O1xufVxuXG5leHBvcnQgdHlwZSBNaWNyb3dhdmVTdWJqZWN0c01hcDxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBNYXA8XG4gIEssXG4gIEJlaGF2aW9yU3ViamVjdDxUW0tdPlxuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRQcm9wZXJ0eVN1YmplY3Q8VCwgSyBleHRlbmRzIGtleW9mIFQsIFBST1AgZXh0ZW5kcyBLPihcbiAgc3ViamVjdHNNYXA6IE1pY3Jvd2F2ZVN1YmplY3RzTWFwPFQsIEs+LFxuICBwcm9wZXJ0eTogUFJPUFxuKTogQmVoYXZpb3JTdWJqZWN0PFRbUFJPUF0+IHtcbiAgbGV0IHN1YmplY3QgPSBzdWJqZWN0c01hcC5nZXQocHJvcGVydHkpO1xuXG4gIGlmIChzdWJqZWN0ID09IG51bGwpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHVuZGVmaW5lZCBhcyBhbnkpO1xuICAgIHN1YmplY3RzTWFwLnNldChwcm9wZXJ0eSwgc3ViamVjdCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICByZXR1cm4gc3ViamVjdCBhcyBhbnk7XG59XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { getEngine } from './core/engine';
|
|
2
|
+
export function getStrategyDevKit(component) {
|
|
3
|
+
const { changed$, destroyed$, initialized$, detach, detectChanges } = getEngine(component);
|
|
4
|
+
return { changed$, destroyed$, initialized$, detach, detectChanges };
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2a2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWljcm93YXZlL3NyYy9saWIvZGV2a2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQStCLE1BQU0sZUFBZSxDQUFDO0FBRXZFLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsU0FBMkI7SUFFM0IsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FDakUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDdkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEVuZ2luZSwgTWljcm93YXZlZCwgTWljcm93YXZlRW5naW5lIH0gZnJvbSAnLi9jb3JlL2VuZ2luZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJhdGVneURldktpdDxULCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+KFxuICBjb21wb25lbnQ6IE1pY3Jvd2F2ZWQ8VCwgSz5cbik6IFN0cmF0ZWd5RGV2S2l0PFQsIEs+IHtcbiAgY29uc3QgeyBjaGFuZ2VkJCwgZGVzdHJveWVkJCwgaW5pdGlhbGl6ZWQkLCBkZXRhY2gsIGRldGVjdENoYW5nZXMgfSA9XG4gICAgZ2V0RW5naW5lKGNvbXBvbmVudCk7XG4gIHJldHVybiB7IGNoYW5nZWQkLCBkZXN0cm95ZWQkLCBpbml0aWFsaXplZCQsIGRldGFjaCwgZGV0ZWN0Q2hhbmdlcyB9O1xufVxuXG5leHBvcnQgdHlwZSBTdHJhdGVneURldktpdDxULCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+ID0gUGljazxcbiAgTWljcm93YXZlRW5naW5lPFQsIEs+LFxuICAnY2hhbmdlZCQnIHwgJ2Rlc3Ryb3llZCQnIHwgJ2luaXRpYWxpemVkJCcgfCAnZGV0YWNoJyB8ICdkZXRlY3RDaGFuZ2VzJ1xuPjtcblxuZXhwb3J0IHR5cGUgU3RyYXRlZ3k8VD4gPSAoc3RyYXRlZ3lEZXZLaXQ6IFN0cmF0ZWd5RGV2S2l0PFQ+KSA9PiB2b2lkO1xuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { takeUntil } from 'rxjs';
|
|
2
|
+
import { applyStrategy } from './apply-strategy';
|
|
3
|
+
import { getEngine } from './core/engine';
|
|
4
|
+
import { asapStrategy } from './strategies/asap';
|
|
5
|
+
export function Microwave({ strategy = asapStrategy } = {}) {
|
|
6
|
+
return function MicrowaveDecorator(componentType) {
|
|
7
|
+
applyStrategy(componentType, strategy);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function watch(component, property) {
|
|
11
|
+
const { destroyed$, watchProperty } = getEngine(component);
|
|
12
|
+
return watchProperty(property).pipe(takeUntil(destroyed$));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm93YXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWljcm93YXZlL3NyYy9saWIvbWljcm93YXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE1BQU0sVUFBVSxTQUFTLENBQUMsRUFBRSxRQUFRLEdBQUcsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUN4RCxPQUFPLFNBQVMsa0JBQWtCLENBQUksYUFBa0M7UUFDdEUsYUFBYSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FDbkIsU0FBWSxFQUNaLFFBQVc7SUFFWCxNQUFNLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgYXBwbHlTdHJhdGVneSB9IGZyb20gJy4vYXBwbHktc3RyYXRlZ3knO1xuaW1wb3J0IHsgZ2V0RW5naW5lIH0gZnJvbSAnLi9jb3JlL2VuZ2luZSc7XG5pbXBvcnQgeyBJdnlDb21wb25lbnRUeXBlIH0gZnJvbSAnLi9zaGFyZWQvZGVjb3JhdG9yJztcbmltcG9ydCB7IGFzYXBTdHJhdGVneSB9IGZyb20gJy4vc3RyYXRlZ2llcy9hc2FwJztcblxuZXhwb3J0IGZ1bmN0aW9uIE1pY3Jvd2F2ZSh7IHN0cmF0ZWd5ID0gYXNhcFN0cmF0ZWd5IH0gPSB7fSkge1xuICByZXR1cm4gZnVuY3Rpb24gTWljcm93YXZlRGVjb3JhdG9yPFQ+KGNvbXBvbmVudFR5cGU6IEl2eUNvbXBvbmVudFR5cGU8VD4pIHtcbiAgICBhcHBseVN0cmF0ZWd5KGNvbXBvbmVudFR5cGUsIHN0cmF0ZWd5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoPFQsIEsgZXh0ZW5kcyBrZXlvZiBUID0ga2V5b2YgVD4oXG4gIGNvbXBvbmVudDogVCxcbiAgcHJvcGVydHk6IEtcbik6IE9ic2VydmFibGU8VFtLXSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGRlc3Ryb3llZCQsIHdhdGNoUHJvcGVydHkgfSA9IGdldEVuZ2luZShjb21wb25lbnQpO1xuICByZXR1cm4gd2F0Y2hQcm9wZXJ0eShwcm9wZXJ0eSkucGlwZSh0YWtlVW50aWwoZGVzdHJveWVkJCkpO1xufVxuIl19
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ChangeDetectorRef, ɵɵdirectiveInject } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* Decorate Angular components with custom hooks.
|
|
4
|
+
*
|
|
5
|
+
* @param componentType the component class to decorate.
|
|
6
|
+
* @param hooks
|
|
7
|
+
*/
|
|
8
|
+
export function decorateComponent(componentType, hooks) {
|
|
9
|
+
const { onCreate, onInit, onDestroy, onPropertyDeclare, onPropertyGet, onPropertySet, } = hooks;
|
|
10
|
+
if (!componentType.ɵfac) {
|
|
11
|
+
throw new Error(`${componentType.name} is either not a component or not compiled.`);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Override component factory.
|
|
15
|
+
*/
|
|
16
|
+
const factory = _decorate(componentType.ɵfac,
|
|
17
|
+
/*
|
|
18
|
+
* Override getters & setters.
|
|
19
|
+
*/
|
|
20
|
+
(factoryFn) => () => {
|
|
21
|
+
/* Grab change detector to control it. */
|
|
22
|
+
const cdr = ɵɵdirectiveInject(ChangeDetectorRef);
|
|
23
|
+
const component = factoryFn();
|
|
24
|
+
/**
|
|
25
|
+
* Notify about creation.
|
|
26
|
+
*/
|
|
27
|
+
onCreate(component, {
|
|
28
|
+
detach() {
|
|
29
|
+
cdr.detach();
|
|
30
|
+
},
|
|
31
|
+
detectChanges() {
|
|
32
|
+
cdr.detectChanges();
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* This will only list initialized properties.
|
|
37
|
+
* That's the reason why all properties should be initialized
|
|
38
|
+
* when using Microwave.
|
|
39
|
+
*/
|
|
40
|
+
for (const property of Object.getOwnPropertyNames(component)) {
|
|
41
|
+
/**
|
|
42
|
+
* Notify when property is discovered.
|
|
43
|
+
*/
|
|
44
|
+
onPropertyDeclare(component, property, component[property]);
|
|
45
|
+
Object.defineProperty(component, property, {
|
|
46
|
+
set(value) {
|
|
47
|
+
/**
|
|
48
|
+
* Call setter.
|
|
49
|
+
*/
|
|
50
|
+
onPropertySet(component, property, value);
|
|
51
|
+
},
|
|
52
|
+
get() {
|
|
53
|
+
/**
|
|
54
|
+
* Call getter.
|
|
55
|
+
*/
|
|
56
|
+
return onPropertyGet(component, property);
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return component;
|
|
61
|
+
});
|
|
62
|
+
/**
|
|
63
|
+
* Override factory with the newly decorated one.
|
|
64
|
+
*/
|
|
65
|
+
Object.defineProperty(componentType, 'ɵfac', {
|
|
66
|
+
get() {
|
|
67
|
+
return factory;
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
/**
|
|
71
|
+
* Link hooks.
|
|
72
|
+
*/
|
|
73
|
+
_spyOnMethod(componentType, 'ngOnInit', onInit);
|
|
74
|
+
_spyOnMethod(componentType, 'ngOnDestroy', onDestroy);
|
|
75
|
+
}
|
|
76
|
+
export function _spyOnMethod(klass, methodName, callback) {
|
|
77
|
+
const proto = klass.prototype;
|
|
78
|
+
proto[methodName] = _decorate(proto[methodName], (wrappedMethod) => {
|
|
79
|
+
return function () {
|
|
80
|
+
callback(this);
|
|
81
|
+
return wrappedMethod?.bind(this)?.();
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
+
export function _decorate(fn, decorator) {
|
|
87
|
+
return decorator(fn);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWljcm93YXZlL3NyYy9saWIvc2hhcmVkL2RlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQVEsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0U7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLGFBQWtDLEVBQ2xDLEtBQXdCO0lBRXhCLE1BQU0sRUFDSixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGFBQWEsR0FDZCxHQUFHLEtBQUssQ0FBQztJQUVWLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxhQUFhLENBQUMsSUFBSSw2Q0FBNkMsQ0FDbkUsQ0FBQztLQUNIO0lBRUQ7O09BRUc7SUFDSCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQ3ZCLGFBQWEsQ0FBQyxJQUFJO0lBQ2xCOztPQUVHO0lBQ0gsQ0FBQyxTQUFrQixFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUU7UUFDM0IseUNBQXlDO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFakQsTUFBTSxTQUFTLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFFOUI7O1dBRUc7UUFDSCxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ2xCLE1BQU07Z0JBQ0osR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2YsQ0FBQztZQUNELGFBQWE7Z0JBQ1gsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RCLENBQUM7U0FDRixDQUFDLENBQUM7UUFFSDs7OztXQUlHO1FBQ0gsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQy9DLFNBQVMsQ0FDRSxFQUFFO1lBQ2I7O2VBRUc7WUFDSCxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBRTVELE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRTtnQkFDekMsR0FBRyxDQUFDLEtBQUs7b0JBQ1A7O3VCQUVHO29CQUNILGFBQWEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO2dCQUNELEdBQUc7b0JBQ0Q7O3VCQUVHO29CQUNILE9BQU8sYUFBYSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDNUMsQ0FBQzthQUNGLENBQUMsQ0FBQztTQUNKO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUNGLENBQUM7SUFFRjs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRTtRQUMzQyxHQUFHO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVIOztPQUVHO0lBQ0gsWUFBWSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsWUFBWSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQTZDRCxNQUFNLFVBQVUsWUFBWSxDQUMxQixLQUFjLEVBQ2QsVUFBa0IsRUFDbEIsUUFBK0I7SUFFL0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUM5QixLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsU0FBUyxDQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLEVBQ2pCLENBQUMsYUFBeUIsRUFBRSxFQUFFO1FBQzVCLE9BQU87WUFDTCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZixPQUFPLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsU0FBUyxDQUN2QixFQUFLLEVBQ0wsU0FBdUI7SUFFdkIsT0FBTyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBUeXBlLCDJtcm1ZGlyZWN0aXZlSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25GbnMgfSBmcm9tICcuLi9jb3JlL2NoYW5nZS1kZXRlY3Rpb24tZm5zJztcblxuLyoqXG4gKiBEZWNvcmF0ZSBBbmd1bGFyIGNvbXBvbmVudHMgd2l0aCBjdXN0b20gaG9va3MuXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudFR5cGUgdGhlIGNvbXBvbmVudCBjbGFzcyB0byBkZWNvcmF0ZS5cbiAqIEBwYXJhbSBob29rc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGVDb21wb25lbnQ8VCwgSyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPihcbiAgY29tcG9uZW50VHlwZTogSXZ5Q29tcG9uZW50VHlwZTxUPixcbiAgaG9va3M6IERlY29yYXRvckhvb2tzPFQ+XG4pIHtcbiAgY29uc3Qge1xuICAgIG9uQ3JlYXRlLFxuICAgIG9uSW5pdCxcbiAgICBvbkRlc3Ryb3ksXG4gICAgb25Qcm9wZXJ0eURlY2xhcmUsXG4gICAgb25Qcm9wZXJ0eUdldCxcbiAgICBvblByb3BlcnR5U2V0LFxuICB9ID0gaG9va3M7XG5cbiAgaWYgKCFjb21wb25lbnRUeXBlLsm1ZmFjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29tcG9uZW50VHlwZS5uYW1lfSBpcyBlaXRoZXIgbm90IGEgY29tcG9uZW50IG9yIG5vdCBjb21waWxlZC5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBjb21wb25lbnQgZmFjdG9yeS5cbiAgICovXG4gIGNvbnN0IGZhY3RvcnkgPSBfZGVjb3JhdGUoXG4gICAgY29tcG9uZW50VHlwZS7JtWZhYyxcbiAgICAvKlxuICAgICAqIE92ZXJyaWRlIGdldHRlcnMgJiBzZXR0ZXJzLlxuICAgICAqL1xuICAgIChmYWN0b3J5Rm46ICgpID0+IFQpID0+ICgpID0+IHtcbiAgICAgIC8qIEdyYWIgY2hhbmdlIGRldGVjdG9yIHRvIGNvbnRyb2wgaXQuICovXG4gICAgICBjb25zdCBjZHIgPSDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAgICAgY29uc3QgY29tcG9uZW50ID0gZmFjdG9yeUZuKCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogTm90aWZ5IGFib3V0IGNyZWF0aW9uLlxuICAgICAgICovXG4gICAgICBvbkNyZWF0ZShjb21wb25lbnQsIHtcbiAgICAgICAgZGV0YWNoKCkge1xuICAgICAgICAgIGNkci5kZXRhY2goKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGV0ZWN0Q2hhbmdlcygpIHtcbiAgICAgICAgICBjZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhpcyB3aWxsIG9ubHkgbGlzdCBpbml0aWFsaXplZCBwcm9wZXJ0aWVzLlxuICAgICAgICogVGhhdCdzIHRoZSByZWFzb24gd2h5IGFsbCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgICAgICogd2hlbiB1c2luZyBNaWNyb3dhdmUuXG4gICAgICAgKi9cbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gICAgICAgIGNvbXBvbmVudFxuICAgICAgKSBhcyBBcnJheTxLPikge1xuICAgICAgICAvKipcbiAgICAgICAgICogTm90aWZ5IHdoZW4gcHJvcGVydHkgaXMgZGlzY292ZXJlZC5cbiAgICAgICAgICovXG4gICAgICAgIG9uUHJvcGVydHlEZWNsYXJlKGNvbXBvbmVudCwgcHJvcGVydHksIGNvbXBvbmVudFtwcm9wZXJ0eV0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb21wb25lbnQsIHByb3BlcnR5LCB7XG4gICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENhbGwgc2V0dGVyLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBvblByb3BlcnR5U2V0KGNvbXBvbmVudCwgcHJvcGVydHksIHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQ2FsbCBnZXR0ZXIuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHJldHVybiBvblByb3BlcnR5R2V0KGNvbXBvbmVudCwgcHJvcGVydHkpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbiAgKTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgZmFjdG9yeSB3aXRoIHRoZSBuZXdseSBkZWNvcmF0ZWQgb25lLlxuICAgKi9cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbXBvbmVudFR5cGUsICfJtWZhYycsIHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeTtcbiAgICB9LFxuICB9KTtcblxuICAvKipcbiAgICogTGluayBob29rcy5cbiAgICovXG4gIF9zcHlPbk1ldGhvZChjb21wb25lbnRUeXBlLCAnbmdPbkluaXQnLCBvbkluaXQpO1xuICBfc3B5T25NZXRob2QoY29tcG9uZW50VHlwZSwgJ25nT25EZXN0cm95Jywgb25EZXN0cm95KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWNvcmF0b3JIb29rczxULCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+IHtcbiAgLyoqXG4gICAqIEhvb2sgY2FsbGVkIHdoZW4gYSBuZXcgY29tcG9uZW50IGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNyZWF0ZWQgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gYXJncyBjaGFuZ2UgZGV0ZWN0aW9uIGZ1bmN0aW9ucyBmb3IgY29udHJvbGxpbmcgY2hhbmdlIGRldGVjdGlvbi5cbiAgICovXG4gIG9uQ3JlYXRlKGNvbXBvbmVudDogVCwgYXJnczogQ2hhbmdlRGV0ZWN0aW9uRm5zKTogdm9pZDtcblxuICAvKipcbiAgICogSG9vayBjYWxsZWQgd2hlbiBhIG5ldyBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNyZWF0ZWQgY29tcG9uZW50LlxuICAgKi9cbiAgb25Jbml0KGNvbXBvbmVudDogVCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEhvb2sgY2FsbGVkIGp1c3QgYmVmb3JlIHRoZSByZWFsIG5nT25EZXN0cm95IChpZiBpbXBsZW1lbnRlZCkgaXMgY2FsbGVkLlxuICAgKi9cbiAgb25EZXN0cm95KGNvbXBvbmVudDogVCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEhvb2sgY2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBkaXNjb3ZlcmVkLlxuICAgKiBUaGlzIGlzIHRoZSBvcHBvcnR1bml0eSB0byBncmFiIHRoZSBpbml0aWFsIHZhbHVlIGJlZm9yZVxuICAgKiB0aGUgcHJvcGVydHkgaXMgcmVwbGFjZWQgYnkgZ2V0dGVycyBhbmQgc2V0dGVycy5cbiAgICovXG4gIG9uUHJvcGVydHlEZWNsYXJlKGNvbXBvbmVudDogVCwgcHJvcGVydHk6IEssIHZhbHVlOiBUW0tdKTogdm9pZDtcblxuICAvKipcbiAgICogSG9vayBjYWxsZWQgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eS5cbiAgICovXG4gIG9uUHJvcGVydHlHZXQoY29tcG9uZW50OiBULCBwcm9wZXJ0eTogSyk6IFRbS10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvb2sgY2FsbGVkIHRvIHNldCBhIHByb3BlcnR5LlxuICAgKi9cbiAgb25Qcm9wZXJ0eVNldChjb21wb25lbnQ6IFQsIHByb3BlcnR5OiBLLCB2YWx1ZTogVFtLXSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXZ5Q29tcG9uZW50VHlwZTxUPiBleHRlbmRzIFR5cGU8VD4ge1xuICDJtWZhYz86ICgpID0+IFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfc3B5T25NZXRob2Q8VD4oXG4gIGtsYXNzOiBUeXBlPFQ+LFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIGNhbGxiYWNrOiAoaW5zdGFuY2U6IFQpID0+IHZvaWRcbikge1xuICBjb25zdCBwcm90byA9IGtsYXNzLnByb3RvdHlwZTtcbiAgcHJvdG9bbWV0aG9kTmFtZV0gPSBfZGVjb3JhdGUoXG4gICAgcHJvdG9bbWV0aG9kTmFtZV0sXG4gICAgKHdyYXBwZWRNZXRob2Q6ICgpID0+IHZvaWQpID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodGhpczogVCkge1xuICAgICAgICBjYWxsYmFjayh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZWRNZXRob2Q/LmJpbmQodGhpcyk/LigpO1xuICAgICAgfTtcbiAgICB9XG4gICk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gX2RlY29yYXRlPEYgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oXG4gIGZuOiBGLFxuICBkZWNvcmF0b3I6IChmbjogRikgPT4gRlxuKSB7XG4gIHJldHVybiBkZWNvcmF0b3IoZm4pO1xufVxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { audit } from 'rxjs';
|
|
2
|
+
import { createLocalStrategy } from './local';
|
|
3
|
+
/**
|
|
4
|
+
* A strategy that coalesces changes using microtask scheduling.
|
|
5
|
+
*/
|
|
6
|
+
export const asapStrategy = createLocalStrategy({
|
|
7
|
+
coalescer: audit(() => Promise.resolve()),
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL21pY3Jvd2F2ZS9zcmMvbGliL3N0cmF0ZWdpZXMvYXNhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU5Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBc0IsbUJBQW1CLENBQUM7SUFDakUsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDMUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXVkaXQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN0cmF0ZWd5IH0gZnJvbSAnLi4vZGV2a2l0JztcbmltcG9ydCB7IGNyZWF0ZUxvY2FsU3RyYXRlZ3kgfSBmcm9tICcuL2xvY2FsJztcblxuLyoqXG4gKiBBIHN0cmF0ZWd5IHRoYXQgY29hbGVzY2VzIGNoYW5nZXMgdXNpbmcgbWljcm90YXNrIHNjaGVkdWxpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBhc2FwU3RyYXRlZ3k6IFN0cmF0ZWd5PHVua25vd24+ID0gY3JlYXRlTG9jYWxTdHJhdGVneSh7XG4gIGNvYWxlc2NlcjogYXVkaXQoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpLFxufSk7XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { audit, timer } from 'rxjs';
|
|
2
|
+
import { createLocalStrategy } from './local';
|
|
3
|
+
/**
|
|
4
|
+
* A strategy that coalesces changes using macrotask scheduling.
|
|
5
|
+
*/
|
|
6
|
+
export const asyncStrategy = createLocalStrategy({
|
|
7
|
+
coalescer: audit(() => timer(0)),
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taWNyb3dhdmUvc3JjL2xpYi9zdHJhdGVnaWVzL2FzeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU5Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBc0IsbUJBQW1CLENBQUM7SUFDbEUsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXVkaXQsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdHJhdGVneSB9IGZyb20gJy4uL2RldmtpdCc7XG5pbXBvcnQgeyBjcmVhdGVMb2NhbFN0cmF0ZWd5IH0gZnJvbSAnLi9sb2NhbCc7XG5cbi8qKlxuICogQSBzdHJhdGVneSB0aGF0IGNvYWxlc2NlcyBjaGFuZ2VzIHVzaW5nIG1hY3JvdGFzayBzY2hlZHVsaW5nLlxuICovXG5leHBvcnQgY29uc3QgYXN5bmNTdHJhdGVneTogU3RyYXRlZ3k8dW5rbm93bj4gPSBjcmVhdGVMb2NhbFN0cmF0ZWd5KHtcbiAgY29hbGVzY2VyOiBhdWRpdCgoKSA9PiB0aW1lcigwKSksXG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createLocalStrategy } from './local';
|
|
2
|
+
export { syncStrategy } from './sync';
|
|
3
|
+
export { asapStrategy } from './asap';
|
|
4
|
+
export { asyncStrategy } from './async';
|
|
5
|
+
export { rafStrategy } from './raf';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taWNyb3dhdmUvc3JjL2xpYi9zdHJhdGVnaWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgY3JlYXRlTG9jYWxTdHJhdGVneSB9IGZyb20gJy4vbG9jYWwnO1xuZXhwb3J0IHsgc3luY1N0cmF0ZWd5IH0gZnJvbSAnLi9zeW5jJztcbmV4cG9ydCB7IGFzYXBTdHJhdGVneSB9IGZyb20gJy4vYXNhcCc7XG5leHBvcnQgeyBhc3luY1N0cmF0ZWd5IH0gZnJvbSAnLi9hc3luYyc7XG5leHBvcnQgeyByYWZTdHJhdGVneSB9IGZyb20gJy4vcmFmJztcbiJdfQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { concat, takeUntil } from 'rxjs';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a change detection strategy which is local to the component.
|
|
4
|
+
* It implements optional coalescing which can be customized using `coalescer` parameter.
|
|
5
|
+
*
|
|
6
|
+
* @example createLocalStrategy()
|
|
7
|
+
* @example createLocalStrategy({coalescer: audit(() => Promise.resolve())})
|
|
8
|
+
*
|
|
9
|
+
* @returns a strategy that can be used with Microwave decorator.
|
|
10
|
+
*/
|
|
11
|
+
export const createLocalStrategy = ({ coalescer, } = {}) => ({ initialized$, changed$, destroyed$, detach, detectChanges }) => {
|
|
12
|
+
/**
|
|
13
|
+
* Detach change detection as we want to take control.
|
|
14
|
+
*/
|
|
15
|
+
detach();
|
|
16
|
+
/**
|
|
17
|
+
* Trigger change detection initially and on property changes.
|
|
18
|
+
* Coalesce through micro-tasks.
|
|
19
|
+
*/
|
|
20
|
+
let source$ = concat(initialized$, changed$);
|
|
21
|
+
if (coalescer != null) {
|
|
22
|
+
source$ = source$.pipe(coalescer);
|
|
23
|
+
}
|
|
24
|
+
source$.pipe(takeUntil(destroyed$)).subscribe(() => detectChanges());
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taWNyb3dhdmUvc3JjL2xpYi9zdHJhdGVnaWVzL2xvY2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQTRCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUduRTs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUM5QixDQUFDLEVBQ0MsU0FBUyxNQUN5QyxFQUFFLEVBQXFCLEVBQUUsQ0FDN0UsQ0FBQyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFO0lBQ2hFOztPQUVHO0lBQ0gsTUFBTSxFQUFFLENBQUM7SUFFVDs7O09BR0c7SUFDSCxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtRQUNyQixPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNuQztJQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7QUFDdkUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uY2F0LCBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3RyYXRlZ3kgfSBmcm9tICcuLi9kZXZraXQnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjaGFuZ2UgZGV0ZWN0aW9uIHN0cmF0ZWd5IHdoaWNoIGlzIGxvY2FsIHRvIHRoZSBjb21wb25lbnQuXG4gKiBJdCBpbXBsZW1lbnRzIG9wdGlvbmFsIGNvYWxlc2Npbmcgd2hpY2ggY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgYGNvYWxlc2NlcmAgcGFyYW1ldGVyLlxuICpcbiAqIEBleGFtcGxlIGNyZWF0ZUxvY2FsU3RyYXRlZ3koKVxuICogQGV4YW1wbGUgY3JlYXRlTG9jYWxTdHJhdGVneSh7Y29hbGVzY2VyOiBhdWRpdCgoKSA9PiBQcm9taXNlLnJlc29sdmUoKSl9KVxuICpcbiAqIEByZXR1cm5zIGEgc3RyYXRlZ3kgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIE1pY3Jvd2F2ZSBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2NhbFN0cmF0ZWd5ID1cbiAgKHtcbiAgICBjb2FsZXNjZXIsXG4gIH06IHsgY29hbGVzY2VyPzogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPHZvaWQ+IH0gPSB7fSk6IFN0cmF0ZWd5PHVua25vd24+ID0+XG4gICh7IGluaXRpYWxpemVkJCwgY2hhbmdlZCQsIGRlc3Ryb3llZCQsIGRldGFjaCwgZGV0ZWN0Q2hhbmdlcyB9KSA9PiB7XG4gICAgLyoqXG4gICAgICogRGV0YWNoIGNoYW5nZSBkZXRlY3Rpb24gYXMgd2Ugd2FudCB0byB0YWtlIGNvbnRyb2wuXG4gICAgICovXG4gICAgZGV0YWNoKCk7XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaW5pdGlhbGx5IGFuZCBvbiBwcm9wZXJ0eSBjaGFuZ2VzLlxuICAgICAqIENvYWxlc2NlIHRocm91Z2ggbWljcm8tdGFza3MuXG4gICAgICovXG4gICAgbGV0IHNvdXJjZSQgPSBjb25jYXQoaW5pdGlhbGl6ZWQkLCBjaGFuZ2VkJCk7XG5cbiAgICBpZiAoY29hbGVzY2VyICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSQgPSBzb3VyY2UkLnBpcGUoY29hbGVzY2VyKTtcbiAgICB9XG5cbiAgICBzb3VyY2UkLnBpcGUodGFrZVVudGlsKGRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKCkgPT4gZGV0ZWN0Q2hhbmdlcygpKTtcbiAgfTtcbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { audit, animationFrames } from 'rxjs';
|
|
2
|
+
import { createLocalStrategy } from './local';
|
|
3
|
+
/**
|
|
4
|
+
* A strategy that coalesces changes using requestAnimationFrame scheduler.
|
|
5
|
+
*/
|
|
6
|
+
export const rafStrategy = createLocalStrategy({
|
|
7
|
+
coalescer: audit(() => animationFrames()),
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWljcm93YXZlL3NyYy9saWIvc3RyYXRlZ2llcy9yYWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTlDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFzQixtQkFBbUIsQ0FBQztJQUNoRSxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO0NBQzFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF1ZGl0LCBhbmltYXRpb25GcmFtZXMgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN0cmF0ZWd5IH0gZnJvbSAnLi4vZGV2a2l0JztcbmltcG9ydCB7IGNyZWF0ZUxvY2FsU3RyYXRlZ3kgfSBmcm9tICcuL2xvY2FsJztcblxuLyoqXG4gKiBBIHN0cmF0ZWd5IHRoYXQgY29hbGVzY2VzIGNoYW5nZXMgdXNpbmcgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHNjaGVkdWxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHJhZlN0cmF0ZWd5OiBTdHJhdGVneTx1bmtub3duPiA9IGNyZWF0ZUxvY2FsU3RyYXRlZ3koe1xuICBjb2FsZXNjZXI6IGF1ZGl0KCgpID0+IGFuaW1hdGlvbkZyYW1lcygpKSxcbn0pO1xuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createLocalStrategy } from './local';
|
|
2
|
+
export const syncStrategy = createLocalStrategy();
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL21pY3Jvd2F2ZS9zcmMvbGliL3N0cmF0ZWdpZXMvc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHOUMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFzQixtQkFBbUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlTG9jYWxTdHJhdGVneSB9IGZyb20gJy4vbG9jYWwnO1xuaW1wb3J0IHsgU3RyYXRlZ3kgfSBmcm9tICcuLi9kZXZraXQnO1xuXG5leHBvcnQgY29uc3Qgc3luY1N0cmF0ZWd5OiBTdHJhdGVneTx1bmtub3duPiA9IGNyZWF0ZUxvY2FsU3RyYXRlZ3koKTtcbiJdfQ==
|