import type { Observable } from 'rxjs'; import { Workspaces } from 'nx/src/config/workspaces'; import { Executor, ExecutorContext } from 'nx/src/config/misc-interfaces'; /** * Convert an Nx Executor into an Angular Devkit Builder * * Use this to expose a compatible Angular Builder */ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export function convertNxExecutor(executor: Executor) { const builderFunction = (options, builderContext) => { const workspaces = new Workspaces(builderContext.workspaceRoot); const workspaceConfig = workspaces.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( promiseOrAsyncIterator: Promise | AsyncIterableIterator ): Observable { if (typeof (promiseOrAsyncIterator as any).then === 'function') { return require('rxjs').from(promiseOrAsyncIterator as Promise); } else { return new (require('rxjs').Observable)((subscriber) => { let asyncIterator = promiseOrAsyncIterator as AsyncIterableIterator; function recurse(iterator: AsyncIterableIterator) { 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(); }; }); } }