Skip to content

Commit 267211d

Browse files
Spencerspalger
andauthored
[kbn/std] add observable helpers to aid with rxjs 7 upgrade (#79752) (#80089)
Co-authored-by: spalger <spalger@users.noreply.github.com> Co-authored-by: spalger <spalger@users.noreply.github.com>
1 parent 5469edf commit 267211d

17 files changed

+672
-126
lines changed

NOTICE.txt

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,212 @@ THE SOFTWARE.
118118
This product uses Noto fonts that are licensed under the SIL Open
119119
Font License, Version 1.1.
120120

121+
---
122+
We include the `firstValueFrom()` and `lastValueFrom()` helpers
123+
extracted from the v7-beta.7 version of the RxJS library.
124+
125+
Apache License
126+
Version 2.0, January 2004
127+
http://www.apache.org/licenses/
128+
129+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
130+
131+
1. Definitions.
132+
133+
"License" shall mean the terms and conditions for use, reproduction,
134+
and distribution as defined by Sections 1 through 9 of this document.
135+
136+
"Licensor" shall mean the copyright owner or entity authorized by
137+
the copyright owner that is granting the License.
138+
139+
"Legal Entity" shall mean the union of the acting entity and all
140+
other entities that control, are controlled by, or are under common
141+
control with that entity. For the purposes of this definition,
142+
"control" means (i) the power, direct or indirect, to cause the
143+
direction or management of such entity, whether by contract or
144+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
145+
outstanding shares, or (iii) beneficial ownership of such entity.
146+
147+
"You" (or "Your") shall mean an individual or Legal Entity
148+
exercising permissions granted by this License.
149+
150+
"Source" form shall mean the preferred form for making modifications,
151+
including but not limited to software source code, documentation
152+
source, and configuration files.
153+
154+
"Object" form shall mean any form resulting from mechanical
155+
transformation or translation of a Source form, including but
156+
not limited to compiled object code, generated documentation,
157+
and conversions to other media types.
158+
159+
"Work" shall mean the work of authorship, whether in Source or
160+
Object form, made available under the License, as indicated by a
161+
copyright notice that is included in or attached to the work
162+
(an example is provided in the Appendix below).
163+
164+
"Derivative Works" shall mean any work, whether in Source or Object
165+
form, that is based on (or derived from) the Work and for which the
166+
editorial revisions, annotations, elaborations, or other modifications
167+
represent, as a whole, an original work of authorship. For the purposes
168+
of this License, Derivative Works shall not include works that remain
169+
separable from, or merely link (or bind by name) to the interfaces of,
170+
the Work and Derivative Works thereof.
171+
172+
"Contribution" shall mean any work of authorship, including
173+
the original version of the Work and any modifications or additions
174+
to that Work or Derivative Works thereof, that is intentionally
175+
submitted to Licensor for inclusion in the Work by the copyright owner
176+
or by an individual or Legal Entity authorized to submit on behalf of
177+
the copyright owner. For the purposes of this definition, "submitted"
178+
means any form of electronic, verbal, or written communication sent
179+
to the Licensor or its representatives, including but not limited to
180+
communication on electronic mailing lists, source code control systems,
181+
and issue tracking systems that are managed by, or on behalf of, the
182+
Licensor for the purpose of discussing and improving the Work, but
183+
excluding communication that is conspicuously marked or otherwise
184+
designated in writing by the copyright owner as "Not a Contribution."
185+
186+
"Contributor" shall mean Licensor and any individual or Legal Entity
187+
on behalf of whom a Contribution has been received by Licensor and
188+
subsequently incorporated within the Work.
189+
190+
2. Grant of Copyright License. Subject to the terms and conditions of
191+
this License, each Contributor hereby grants to You a perpetual,
192+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
193+
copyright license to reproduce, prepare Derivative Works of,
194+
publicly display, publicly perform, sublicense, and distribute the
195+
Work and such Derivative Works in Source or Object form.
196+
197+
3. Grant of Patent License. Subject to the terms and conditions of
198+
this License, each Contributor hereby grants to You a perpetual,
199+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
200+
(except as stated in this section) patent license to make, have made,
201+
use, offer to sell, sell, import, and otherwise transfer the Work,
202+
where such license applies only to those patent claims licensable
203+
by such Contributor that are necessarily infringed by their
204+
Contribution(s) alone or by combination of their Contribution(s)
205+
with the Work to which such Contribution(s) was submitted. If You
206+
institute patent litigation against any entity (including a
207+
cross-claim or counterclaim in a lawsuit) alleging that the Work
208+
or a Contribution incorporated within the Work constitutes direct
209+
or contributory patent infringement, then any patent licenses
210+
granted to You under this License for that Work shall terminate
211+
as of the date such litigation is filed.
212+
213+
4. Redistribution. You may reproduce and distribute copies of the
214+
Work or Derivative Works thereof in any medium, with or without
215+
modifications, and in Source or Object form, provided that You
216+
meet the following conditions:
217+
218+
(a) You must give any other recipients of the Work or
219+
Derivative Works a copy of this License; and
220+
221+
(b) You must cause any modified files to carry prominent notices
222+
stating that You changed the files; and
223+
224+
(c) You must retain, in the Source form of any Derivative Works
225+
that You distribute, all copyright, patent, trademark, and
226+
attribution notices from the Source form of the Work,
227+
excluding those notices that do not pertain to any part of
228+
the Derivative Works; and
229+
230+
(d) If the Work includes a "NOTICE" text file as part of its
231+
distribution, then any Derivative Works that You distribute must
232+
include a readable copy of the attribution notices contained
233+
within such NOTICE file, excluding those notices that do not
234+
pertain to any part of the Derivative Works, in at least one
235+
of the following places: within a NOTICE text file distributed
236+
as part of the Derivative Works; within the Source form or
237+
documentation, if provided along with the Derivative Works; or,
238+
within a display generated by the Derivative Works, if and
239+
wherever such third-party notices normally appear. The contents
240+
of the NOTICE file are for informational purposes only and
241+
do not modify the License. You may add Your own attribution
242+
notices within Derivative Works that You distribute, alongside
243+
or as an addendum to the NOTICE text from the Work, provided
244+
that such additional attribution notices cannot be construed
245+
as modifying the License.
246+
247+
You may add Your own copyright statement to Your modifications and
248+
may provide additional or different license terms and conditions
249+
for use, reproduction, or distribution of Your modifications, or
250+
for any such Derivative Works as a whole, provided Your use,
251+
reproduction, and distribution of the Work otherwise complies with
252+
the conditions stated in this License.
253+
254+
5. Submission of Contributions. Unless You explicitly state otherwise,
255+
any Contribution intentionally submitted for inclusion in the Work
256+
by You to the Licensor shall be under the terms and conditions of
257+
this License, without any additional terms or conditions.
258+
Notwithstanding the above, nothing herein shall supersede or modify
259+
the terms of any separate license agreement you may have executed
260+
with Licensor regarding such Contributions.
261+
262+
6. Trademarks. This License does not grant permission to use the trade
263+
names, trademarks, service marks, or product names of the Licensor,
264+
except as required for reasonable and customary use in describing the
265+
origin of the Work and reproducing the content of the NOTICE file.
266+
267+
7. Disclaimer of Warranty. Unless required by applicable law or
268+
agreed to in writing, Licensor provides the Work (and each
269+
Contributor provides its Contributions) on an "AS IS" BASIS,
270+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
271+
implied, including, without limitation, any warranties or conditions
272+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
273+
PARTICULAR PURPOSE. You are solely responsible for determining the
274+
appropriateness of using or redistributing the Work and assume any
275+
risks associated with Your exercise of permissions under this License.
276+
277+
8. Limitation of Liability. In no event and under no legal theory,
278+
whether in tort (including negligence), contract, or otherwise,
279+
unless required by applicable law (such as deliberate and grossly
280+
negligent acts) or agreed to in writing, shall any Contributor be
281+
liable to You for damages, including any direct, indirect, special,
282+
incidental, or consequential damages of any character arising as a
283+
result of this License or out of the use or inability to use the
284+
Work (including but not limited to damages for loss of goodwill,
285+
work stoppage, computer failure or malfunction, or any and all
286+
other commercial damages or losses), even if such Contributor
287+
has been advised of the possibility of such damages.
288+
289+
9. Accepting Warranty or Additional Liability. While redistributing
290+
the Work or Derivative Works thereof, You may choose to offer,
291+
and charge a fee for, acceptance of support, warranty, indemnity,
292+
or other liability obligations and/or rights consistent with this
293+
License. However, in accepting such obligations, You may act only
294+
on Your own behalf and on Your sole responsibility, not on behalf
295+
of any other Contributor, and only if You agree to indemnify,
296+
defend, and hold each Contributor harmless for any liability
297+
incurred by, or claims asserted against, such Contributor by reason
298+
of your accepting any such warranty or additional liability.
299+
300+
END OF TERMS AND CONDITIONS
301+
302+
APPENDIX: How to apply the Apache License to your work.
303+
304+
To apply the Apache License to your work, attach the following
305+
boilerplate notice, with the fields enclosed by brackets "[]"
306+
replaced with your own identifying information. (Don't include
307+
the brackets!) The text should be enclosed in the appropriate
308+
comment syntax for the file format. We also recommend that a
309+
file or class name and description of purpose be included on the
310+
same "printed page" as the copyright notice for easier
311+
identification within third-party archives.
312+
313+
Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors
314+
315+
Licensed under the Apache License, Version 2.0 (the "License");
316+
you may not use this file except in compliance with the License.
317+
You may obtain a copy of the License at
318+
319+
http://www.apache.org/licenses/LICENSE-2.0
320+
321+
Unless required by applicable law or agreed to in writing, software
322+
distributed under the License is distributed on an "AS IS" BASIS,
323+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
324+
See the License for the specific language governing permissions and
325+
limitations under the License.
326+
121327
---
122328
Based on the scroll-into-view-if-necessary module from npm
123329
https://github.com/stipsan/compute-scroll-into-view/blob/master/src/index.ts#L269-L340

packages/kbn-optimizer/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ const config = OptimizerConfig.create({
8484
dist: true
8585
});
8686

87-
await runOptimizer(config)
88-
.pipe(logOptimizerState(log, config))
89-
.toPromise();
87+
await lastValueFrom(
88+
runOptimizer(config).pipe(logOptimizerState(log, config))
89+
);
9090
```
9191

9292
This is essentially what we're doing in [`script/build_kibana_platform_plugins`][Cli] and the new [build system task][BuildTask].

packages/kbn-optimizer/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"@babel/core": "^7.11.6",
1515
"@kbn/babel-preset": "1.0.0",
1616
"@kbn/dev-utils": "1.0.0",
17+
"@kbn/std": "1.0.0",
1718
"@kbn/ui-shared-deps": "1.0.0",
1819
"autoprefixer": "^9.7.4",
1920
"babel-loader": "^8.0.6",

packages/kbn-optimizer/src/cli.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import 'source-map-support/register';
2222
import Path from 'path';
2323

2424
import { REPO_ROOT } from '@kbn/utils';
25+
import { lastValueFrom } from '@kbn/std';
2526
import { run, createFlagError, CiStatsReporter } from '@kbn/dev-utils';
2627

2728
import { logOptimizerState } from './log_optimizer_state';
@@ -136,7 +137,7 @@ run(
136137
update$ = update$.pipe(reportOptimizerStats(reporter, config, log));
137138
}
138139

139-
await update$.pipe(logOptimizerState(log, config)).toPromise();
140+
await lastValueFrom(update$.pipe(logOptimizerState(log, config)));
140141

141142
if (updateLimits) {
142143
updateBundleLimits(log, config);

packages/kbn-optimizer/src/common/event_stream_helpers.test.ts

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,21 @@
1818
*/
1919

2020
import * as Rx from 'rxjs';
21-
import { toArray, take } from 'rxjs/operators';
21+
import { take } from 'rxjs/operators';
22+
import { allValuesFrom } from './rxjs_helpers';
2223

2324
import { summarizeEventStream } from './event_stream_helpers';
2425

2526
it('emits each state with each event, ignoring events when summarizer returns undefined', async () => {
2627
const event$ = Rx.of(1, 2, 3, 4, 5);
2728
const initial = 0;
28-
const values = await summarizeEventStream(event$, initial, (state, event) => {
29-
if (event % 2) {
30-
return state + event;
31-
}
32-
})
33-
.pipe(toArray())
34-
.toPromise();
29+
const values = await allValuesFrom(
30+
summarizeEventStream(event$, initial, (state, event) => {
31+
if (event % 2) {
32+
return state + event;
33+
}
34+
})
35+
);
3536

3637
expect(values).toMatchInlineSnapshot(`
3738
Array [
@@ -57,15 +58,15 @@ it('emits each state with each event, ignoring events when summarizer returns un
5758
it('interleaves injected events when source is synchronous', async () => {
5859
const event$ = Rx.of(1, 7);
5960
const initial = 0;
60-
const values = await summarizeEventStream(event$, initial, (state, event, injectEvent) => {
61-
if (event < 5) {
62-
injectEvent(event + 2);
63-
}
61+
const values = await allValuesFrom(
62+
summarizeEventStream(event$, initial, (state, event, injectEvent) => {
63+
if (event < 5) {
64+
injectEvent(event + 2);
65+
}
6466

65-
return state + event;
66-
})
67-
.pipe(toArray())
68-
.toPromise();
67+
return state + event;
68+
})
69+
);
6970

7071
expect(values).toMatchInlineSnapshot(`
7172
Array [
@@ -95,15 +96,15 @@ it('interleaves injected events when source is synchronous', async () => {
9596
it('interleaves injected events when source is asynchronous', async () => {
9697
const event$ = Rx.of(1, 7, Rx.asyncScheduler);
9798
const initial = 0;
98-
const values = await summarizeEventStream(event$, initial, (state, event, injectEvent) => {
99-
if (event < 5) {
100-
injectEvent(event + 2);
101-
}
99+
const values = await allValuesFrom(
100+
summarizeEventStream(event$, initial, (state, event, injectEvent) => {
101+
if (event < 5) {
102+
injectEvent(event + 2);
103+
}
102104

103-
return state + event;
104-
})
105-
.pipe(toArray())
106-
.toPromise();
105+
return state + event;
106+
})
107+
);
107108

108109
expect(values).toMatchInlineSnapshot(`
109110
Array [
@@ -133,17 +134,17 @@ it('interleaves injected events when source is asynchronous', async () => {
133134
it('interleaves mulitple injected events in order', async () => {
134135
const event$ = Rx.of(1);
135136
const initial = 0;
136-
const values = await summarizeEventStream(event$, initial, (state, event, injectEvent) => {
137-
if (event < 10) {
138-
injectEvent(10);
139-
injectEvent(20);
140-
injectEvent(30);
141-
}
142-
143-
return state + event;
144-
})
145-
.pipe(toArray())
146-
.toPromise();
137+
const values = await allValuesFrom(
138+
summarizeEventStream(event$, initial, (state, event, injectEvent) => {
139+
if (event < 10) {
140+
injectEvent(10);
141+
injectEvent(20);
142+
injectEvent(30);
143+
}
144+
145+
return state + event;
146+
})
147+
);
147148

148149
expect(values).toMatchInlineSnapshot(`
149150
Array [
@@ -179,9 +180,9 @@ it('stops an infinite stream when unsubscribed', async () => {
179180
return prev + event;
180181
});
181182

182-
const values = await summarizeEventStream(event$, initial, summarize)
183-
.pipe(take(11), toArray())
184-
.toPromise();
183+
const values = await allValuesFrom(
184+
summarizeEventStream(event$, initial, summarize).pipe(take(11))
185+
);
185186

186187
expect(values).toMatchInlineSnapshot(`
187188
Array [

0 commit comments

Comments
 (0)