UNPKG

@bespunky/angular-zen

Version:

The Angular tools you always wished were there.

64 lines 12.4 kB
import { Observable, switchMap } from 'rxjs'; import { inject } from '@angular/core'; import { ActivatedRoute, NavigationEnd } from '@angular/router'; import { RouterOutletComponentBus } from '@bespunky/angular-zen/router-x'; import { useRouterEvent } from './use-router-event'; /** * Recoursively runs a processing function on the route and its children. * Scan is done from parent to child, meaning the parent is the first to process. * * @export * @param {(RouterOutletComponentBus | null)} componentBus The instance of the component bus. * @param {ActivatedRouteSnapshot} route The top route on which to apply the processing function. * @param {RouteProcessFunction} process The function to run on the route and its children. * The function receives a `route` argument which reflects the route being processed, * and a `component` argument which reflects the instance of the component loaded for the route's corresponsind outlet. * If the corresponding outlet wasn't marked with the `publishComponent` directive, the `component` argument will be null. * @param {number} [levels=-1] (Optional) The number of levels (excluding the parent) to dive deeper into the route tree. * A value of 1 for example, will process the route and its first-level children only. By default, scans all levels of the route tree. */ export function deepScanRoute(componentBus, route, process, levels = -1) { // Make sure the caller wants scan to proceed, then make sure level limit wasn't reached. const processing = process(route, componentBus?.instance(route.outlet)); // Negative values will scan all, positives will scan until reaching zero. const shouldScanChildren = !processing.done && levels !== 0; if (shouldScanChildren && route.children) route.children.forEach(childRoute => deepScanRoute(componentBus, childRoute, process, levels - 1)); } function observeRouteDeepScan(route, componentBus, process, levels) { return new Observable(({ next, error, complete }) => { const processAndEmit = (...args) => { const result = process(...args); if (result.emit) next(result.emit); return result; }; try { deepScanRoute(componentBus, route, processAndEmit, levels); } catch (e) { error(e); } finally { complete(); } }); } /** * Creates an observable which, upon navigation end, deep scans the activated route by running the provided * processing function. * * @export * @template TResult The type of the value emitted by the provided processing function. * @param {ObservedRouteProcessFunction<TResult>} process The function to run on the activated route and its children. * @param {number} [levels=-1] (Optional) The number of levels (excluding the parent) to dive deeper into the route tree. * A value of 1 for example, will process the route and its first-level children only. By default, scans all levels of the route tree. * @return {Observable<TResult>} An observable which, upon navigation end, deep scans the activated route by running the provided * processing function. */ export function useRouteDeepScan(process, levels = -1) { const route = inject(ActivatedRoute); const componentBus = inject(RouterOutletComponentBus); return useRouterEvent(NavigationEnd).pipe(switchMap(() => observeRouteDeepScan(route.snapshot, componentBus, process, levels))); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXJvdXRlLWRlZXAtc2Nhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci16ZW4vcm91dGVyLXgvdXRpbHMvc3JjL2xpYi91c2Utcm91dGUtZGVlcC1zY2FuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLGNBQWMsRUFBMEIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBMkJwRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDekIsWUFBNkMsRUFDN0MsS0FBNkIsRUFDN0IsT0FBNkIsRUFDN0IsU0FBaUIsQ0FBQyxDQUFDO0lBR25CLHlGQUF5RjtJQUN6RixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFeEUsMEVBQTBFO0lBQzFFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFFNUQsSUFBSSxrQkFBa0IsSUFBSSxLQUFLLENBQUMsUUFBUTtRQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pKLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFVLEtBQTZCLEVBQUUsWUFBNkMsRUFBRSxPQUE4QyxFQUFFLE1BQWU7SUFFaEwsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO1FBRWhELE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxJQUF1RCxFQUFFLEVBQUU7WUFFbEYsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFFaEMsSUFBSSxNQUFNLENBQUMsSUFBSTtnQkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRW5DLE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUVGLElBQ0E7WUFDSSxhQUFhLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDOUQ7UUFDRCxPQUFPLENBQUMsRUFDUjtZQUNJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNaO2dCQUVEO1lBQ0ksUUFBUSxFQUFFLENBQUM7U0FDZDtJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFVLE9BQThDLEVBQUUsU0FBaUIsQ0FBQyxDQUFDO0lBRXpHLE1BQU0sS0FBSyxHQUFVLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUV0RCxPQUFPLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQ3JDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDdkYsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgUm91dGVyT3V0bGV0Q29tcG9uZW50QnVzIH0gZnJvbSAnQGJlc3B1bmt5L2FuZ3VsYXItemVuL3JvdXRlci14JztcbmltcG9ydCB7IEFueU9iamVjdCB9IGZyb20gJ0BiZXNwdW5reS90eXBlc2NyaXB0LXV0aWxzJztcbmltcG9ydCB7IHVzZVJvdXRlckV2ZW50IH0gZnJvbSAnLi91c2Utcm91dGVyLWV2ZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVByb2Nlc3NSZXN1bHRcbntcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBvcHRpbWl6aW5nIHRoZSByZWN1cnNpb24gb2YgdGhlIGRlZXAgcm91dGUgc2Nhbm5pbmcgb3BlcmF0aW9uIGJ5IGZlZWRpbmcgaXQgYmFjayB3aXRoIGEgJ3N0b3AnIHNpZ25hbC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGRvbmU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JzZXJ2ZWRSb3V0ZVByb2Nlc3NSZXN1bHQ8VD4gZXh0ZW5kcyBSb3V0ZVByb2Nlc3NSZXN1bHRcbntcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBmZWVkaW5nIGEgdmFsdWUgZnJvbSB5b3VyIHByb2Nlc3MgZnVuY3Rpb24gYmFjayB0byB0aGUgZGVlcCByb3V0ZSBzY2FubmluZyBvcGVyYXRpb24uXG4gICAgICogVGhlIHNjYW4gb3BlcmF0aW9uIHdpbGwgZW1pdCB0aGlzIHZhbHVlIHRocm91Z2ggdGhlIG9ic2VydmFibGUgaXQgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7VH1cbiAgICAgKi9cbiAgICBlbWl0PzogVDtcbn1cblxuZXhwb3J0IHR5cGUgUm91dGVQcm9jZXNzRnVuY3Rpb248VFJlc3VsdCBleHRlbmRzIFJvdXRlUHJvY2Vzc1Jlc3VsdCA9IFJvdXRlUHJvY2Vzc1Jlc3VsdD4gPSAocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIGNvbXBvbmVudD86IEFueU9iamVjdCB8IG51bGwpID0+IFRSZXN1bHQ7XG5cbmV4cG9ydCB0eXBlIE9ic2VydmVkUm91dGVQcm9jZXNzRnVuY3Rpb248VFJlc3VsdD4gPSBSb3V0ZVByb2Nlc3NGdW5jdGlvbjxPYnNlcnZlZFJvdXRlUHJvY2Vzc1Jlc3VsdDxUUmVzdWx0Pj47XG5cbi8qKlxuICogUmVjb3Vyc2l2ZWx5IHJ1bnMgYSBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9uIHRoZSByb3V0ZSBhbmQgaXRzIGNoaWxkcmVuLlxuICogU2NhbiBpcyBkb25lIGZyb20gcGFyZW50IHRvIGNoaWxkLCBtZWFuaW5nIHRoZSBwYXJlbnQgaXMgdGhlIGZpcnN0IHRvIHByb2Nlc3MuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHsoUm91dGVyT3V0bGV0Q29tcG9uZW50QnVzIHwgbnVsbCl9IGNvbXBvbmVudEJ1cyBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCBidXMuXG4gKiBAcGFyYW0ge0FjdGl2YXRlZFJvdXRlU25hcHNob3R9IHJvdXRlIFRoZSB0b3Agcm91dGUgb24gd2hpY2ggdG8gYXBwbHkgdGhlIHByb2Nlc3NpbmcgZnVuY3Rpb24uIFxuICogQHBhcmFtIHtSb3V0ZVByb2Nlc3NGdW5jdGlvbn0gcHJvY2VzcyBUaGUgZnVuY3Rpb24gdG8gcnVuIG9uIHRoZSByb3V0ZSBhbmQgaXRzIGNoaWxkcmVuLlxuICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGEgYHJvdXRlYCBhcmd1bWVudCB3aGljaCByZWZsZWN0cyB0aGUgcm91dGUgYmVpbmcgcHJvY2Vzc2VkLFxuICogYW5kIGEgYGNvbXBvbmVudGAgYXJndW1lbnQgd2hpY2ggcmVmbGVjdHMgdGhlIGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQgbG9hZGVkIGZvciB0aGUgcm91dGUncyBjb3JyZXNwb25zaW5kIG91dGxldC5cbiAqIElmIHRoZSBjb3JyZXNwb25kaW5nIG91dGxldCB3YXNuJ3QgbWFya2VkIHdpdGggdGhlIGBwdWJsaXNoQ29tcG9uZW50YCBkaXJlY3RpdmUsIHRoZSBgY29tcG9uZW50YCBhcmd1bWVudCB3aWxsIGJlIG51bGwuXG4gKiBAcGFyYW0ge251bWJlcn0gW2xldmVscz0tMV0gKE9wdGlvbmFsKSBUaGUgbnVtYmVyIG9mIGxldmVscyAoZXhjbHVkaW5nIHRoZSBwYXJlbnQpIHRvIGRpdmUgZGVlcGVyIGludG8gdGhlIHJvdXRlIHRyZWUuXG4gKiBBIHZhbHVlIG9mIDEgZm9yIGV4YW1wbGUsIHdpbGwgcHJvY2VzcyB0aGUgcm91dGUgYW5kIGl0cyBmaXJzdC1sZXZlbCBjaGlsZHJlbiBvbmx5LiBCeSBkZWZhdWx0LCBzY2FucyBhbGwgbGV2ZWxzIG9mIHRoZSByb3V0ZSB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFNjYW5Sb3V0ZShcbiAgICBjb21wb25lbnRCdXM6IFJvdXRlck91dGxldENvbXBvbmVudEJ1cyB8IG51bGwsXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gICAgcHJvY2VzczogUm91dGVQcm9jZXNzRnVuY3Rpb24sXG4gICAgbGV2ZWxzOiBudW1iZXIgPSAtMVxuKTogdm9pZFxue1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2FsbGVyIHdhbnRzIHNjYW4gdG8gcHJvY2VlZCwgdGhlbiBtYWtlIHN1cmUgbGV2ZWwgbGltaXQgd2Fzbid0IHJlYWNoZWQuXG4gICAgY29uc3QgcHJvY2Vzc2luZyA9IHByb2Nlc3Mocm91dGUsIGNvbXBvbmVudEJ1cz8uaW5zdGFuY2Uocm91dGUub3V0bGV0KSk7XG5cbiAgICAvLyBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBzY2FuIGFsbCwgcG9zaXRpdmVzIHdpbGwgc2NhbiB1bnRpbCByZWFjaGluZyB6ZXJvLlxuICAgIGNvbnN0IHNob3VsZFNjYW5DaGlsZHJlbiA9ICFwcm9jZXNzaW5nLmRvbmUgJiYgbGV2ZWxzICE9PSAwO1xuICAgIFxuICAgIGlmIChzaG91bGRTY2FuQ2hpbGRyZW4gJiYgcm91dGUuY2hpbGRyZW4pIHJvdXRlLmNoaWxkcmVuLmZvckVhY2goY2hpbGRSb3V0ZSA9PiBkZWVwU2NhblJvdXRlKGNvbXBvbmVudEJ1cywgY2hpbGRSb3V0ZSwgcHJvY2VzcywgbGV2ZWxzIC0gMSkpO1xufVxuXG5mdW5jdGlvbiBvYnNlcnZlUm91dGVEZWVwU2NhbjxUUmV0dXJuPihyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY29tcG9uZW50QnVzOiBSb3V0ZXJPdXRsZXRDb21wb25lbnRCdXMgfCBudWxsLCBwcm9jZXNzOiBPYnNlcnZlZFJvdXRlUHJvY2Vzc0Z1bmN0aW9uPFRSZXR1cm4+LCBsZXZlbHM/OiBudW1iZXIpOiBPYnNlcnZhYmxlPFRSZXR1cm4+XG57XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCh7IG5leHQsIGVycm9yLCBjb21wbGV0ZSB9KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc0FuZEVtaXQgPSAoLi4uYXJnczogUGFyYW1ldGVyczxPYnNlcnZlZFJvdXRlUHJvY2Vzc0Z1bmN0aW9uPFRSZXR1cm4+PikgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcHJvY2VzcyguLi5hcmdzKTtcbiAgICBcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZW1pdCkgbmV4dChyZXN1bHQuZW1pdCk7XG4gICAgXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHRyeVxuICAgICAgICB7XG4gICAgICAgICAgICBkZWVwU2NhblJvdXRlKGNvbXBvbmVudEJ1cywgcm91dGUsIHByb2Nlc3NBbmRFbWl0LCBsZXZlbHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9ic2VydmFibGUgd2hpY2gsIHVwb24gbmF2aWdhdGlvbiBlbmQsIGRlZXAgc2NhbnMgdGhlIGFjdGl2YXRlZCByb3V0ZSBieSBydW5uaW5nIHRoZSBwcm92aWRlZFxuICogcHJvY2Vzc2luZyBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdGVtcGxhdGUgVFJlc3VsdCBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgZW1pdHRlZCBieSB0aGUgcHJvdmlkZWQgcHJvY2Vzc2luZyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7T2JzZXJ2ZWRSb3V0ZVByb2Nlc3NGdW5jdGlvbjxUUmVzdWx0Pn0gcHJvY2VzcyBUaGUgZnVuY3Rpb24gdG8gcnVuIG9uIHRoZSBhY3RpdmF0ZWQgcm91dGUgYW5kIGl0cyBjaGlsZHJlbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWxzPS0xXSAoT3B0aW9uYWwpIFRoZSBudW1iZXIgb2YgbGV2ZWxzIChleGNsdWRpbmcgdGhlIHBhcmVudCkgdG8gZGl2ZSBkZWVwZXIgaW50byB0aGUgcm91dGUgdHJlZS5cbiAqIEEgdmFsdWUgb2YgMSBmb3IgZXhhbXBsZSwgd2lsbCBwcm9jZXNzIHRoZSByb3V0ZSBhbmQgaXRzIGZpcnN0LWxldmVsIGNoaWxkcmVuIG9ubHkuIEJ5IGRlZmF1bHQsIHNjYW5zIGFsbCBsZXZlbHMgb2YgdGhlIHJvdXRlIHRyZWUuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFRSZXN1bHQ+fSBBbiBvYnNlcnZhYmxlIHdoaWNoLCB1cG9uIG5hdmlnYXRpb24gZW5kLCBkZWVwIHNjYW5zIHRoZSBhY3RpdmF0ZWQgcm91dGUgYnkgcnVubmluZyB0aGUgcHJvdmlkZWRcbiAqIHByb2Nlc3NpbmcgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSb3V0ZURlZXBTY2FuPFRSZXN1bHQ+KHByb2Nlc3M6IE9ic2VydmVkUm91dGVQcm9jZXNzRnVuY3Rpb248VFJlc3VsdD4sIGxldmVsczogbnVtYmVyID0gLTEpOiBPYnNlcnZhYmxlPFRSZXN1bHQ+XG57XG4gICAgY29uc3Qgcm91dGUgICAgICAgID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICBjb25zdCBjb21wb25lbnRCdXMgPSBpbmplY3QoUm91dGVyT3V0bGV0Q29tcG9uZW50QnVzKTtcblxuICAgIHJldHVybiB1c2VSb3V0ZXJFdmVudChOYXZpZ2F0aW9uRW5kKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gb2JzZXJ2ZVJvdXRlRGVlcFNjYW4ocm91dGUuc25hcHNob3QsIGNvbXBvbmVudEJ1cywgcHJvY2VzcywgbGV2ZWxzKSlcbiAgICApO1xufSJdfQ==