/
convert-nx-executor.ts
79 lines (73 loc) · 2.22 KB
/
convert-nx-executor.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import { from, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import {
Executor,
ExecutorContext,
Workspaces,
} from '@nrwl/tao/src/shared/workspace';
/**
* Convert an Nx Executor into an Angular Devkit Builder
*
* Use this to expose a compatible Angular Builder
*/
export function convertNxExecutor(executor: Executor) {
const builderFunction = (options, builderContext) => {
const workspaceConfig = new Workspaces(
builderContext.workspaceRoot
).readWorkspaceConfiguration();
const context: ExecutorContext = {
root: builderContext.workspaceRoot,
projectName: builderContext.target.project,
targetName: builderContext.target.target,
configurationName: builderContext.target.configuration,
workspace: workspaceConfig,
cwd: process.cwd(),
isVerbose: false,
};
if (
builderContext.target &&
builderContext.target.project &&
builderContext.target.target
) {
context.target =
workspaceConfig.projects[builderContext.target.project].targets[
builderContext.target.target
];
}
return toObservable(executor(options, context));
};
return require('@angular-devkit/architect').createBuilder(builderFunction);
}
function toObservable<T extends { success: boolean }>(
promiseOrAsyncIterator: Promise<T> | AsyncIterableIterator<T>
): Observable<T> {
if (typeof (promiseOrAsyncIterator as any).then === 'function') {
return from(promiseOrAsyncIterator as Promise<T>);
} else {
return new Observable((subscriber) => {
let asyncIterator = promiseOrAsyncIterator as AsyncIterableIterator<T>;
function recurse(iterator: AsyncIterableIterator<T>) {
iterator
.next()
.then((result) => {
if (!result.done) {
subscriber.next(result.value);
recurse(iterator);
} else {
if (result.value) {
subscriber.next(result.value);
}
subscriber.complete();
}
})
.catch((e) => {
subscriber.error(e);
});
}
recurse(asyncIterator);
return () => {
asyncIterator.return();
};
});
}
}