UNPKG

@bespunky/angular-zen

Version:

The Angular tools you always wished were there.

58 lines 9 kB
import { provideRouter, provideRoutes, Router } from '@angular/router'; import { collectRouteComposersByAutoNavigatorName } from './route-composer/_utils'; import { _NavigatorXToken_ } from './_navigation-x.symbols'; function attemptToProduceAutoNavigationFunctionFor(router, composer) { if (!composer) return undefined; if (composer.hasArgs) { const compose = composer.compose.bind(composer); return (entity) => router.navigateByUrl(compose(entity)); } return () => router.navigateByUrl(composer.compose()); } function createNavigationXFactoryProvider(route) { return { provide: route[_NavigatorXToken_], deps: [Router], useFactory: (router) => { const composers = collectRouteComposersByAutoNavigatorName(route); return new Proxy({}, { get: (_, propertyName) => attemptToProduceAutoNavigationFunctionFor(router, composers.get(propertyName)), has: (_, propertyName) => composers.has(propertyName) }); } }; } function provideNavigatorsFor(...routes) { if (!routes?.length) throw `No routes were provided.`; return routes.map(createNavigationXFactoryProvider); } /** * Wraps Angular's `provideRouter` function and adds providers for the navigation-x module. * * @export * @param {NavigationXRoute<any>[]} routes The Angular routes config tree to initialize navigation-x for. * @param {...NoHead<Parameters<typeof provideRouter>>} features Addtional features to pass into Angular's `provideRouter` function. * @return {Provider[]} The providers returned by `provideRouter`, along with other providers needed for navigation-x to work. */ export function provideRouterX(routes, ...features) { return [ ...provideRouter(routes, ...features), ...provideNavigatorsFor(...routes) ]; } /** * Wraps Angular's `provideRoutes` function and adds providers for the navigation-x module. * * @export * @param {...NavigationXRoute<any>[]} routes The Angular routes config tree to initialize navigation-x for. * @return {Provider[]} The providers returned by `provideRoutes`, along with other providers needed for navigation-x to work. */ export function provideRoutesX(...routes) { return [ ...provideRoutes(routes), ...provideNavigatorsFor(routes) ]; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi14LnByb3ZpZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci16ZW4vcm91dGVyLXgvbmF2aWdhdGlvbi9zcmMvbGliL25hdmlnYXRpb24teC5wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHdkUsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJNUQsU0FBUyx5Q0FBeUMsQ0FBQyxNQUFjLEVBQUUsUUFBaUQ7SUFFaEgsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVoQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQ3BCO1FBQ0ksTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFnQyxDQUFDO1FBRS9FLE9BQU8sQ0FBQyxNQUFlLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDckU7SUFFRCxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsZ0NBQWdDLENBQUMsS0FBc0g7SUFFNUosT0FBTztRQUNILE9BQU8sRUFBRSxLQUFLLENBQUUsaUJBQWlCLENBQUU7UUFDbkMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2QsVUFBVSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUU7WUFFM0IsTUFBTSxTQUFTLEdBQUcsd0NBQXdDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFbEUsT0FBTyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQ2pCLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFvQixFQUFFLEVBQUUsQ0FDN0IseUNBQXlDLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRWxGLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFvQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQzthQUNoRSxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEdBQUcsTUFBK0I7SUFFNUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNO1FBQUUsTUFBTSwwQkFBMEIsQ0FBQztJQUV0RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBR0Q7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBK0IsRUFBRSxHQUFHLFFBQWtEO0lBRWpILE9BQU87UUFDSCxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUM7UUFDckMsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLE1BQU0sQ0FBQztLQUNyQyxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBRyxNQUErQjtJQUU3RCxPQUFPO1FBQ0gsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ3hCLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDO0tBQ2xDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmFjdG9yeVByb3ZpZGVyLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcHJvdmlkZVJvdXRlciwgcHJvdmlkZVJvdXRlcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB0eXBlIHsgTm9IZWFkIH0gZnJvbSAnQGJlc3B1bmt5L3R5cGVzY3JpcHQtdXRpbHMnO1xuXG5pbXBvcnQgeyBjb2xsZWN0Um91dGVDb21wb3NlcnNCeUF1dG9OYXZpZ2F0b3JOYW1lIH0gZnJvbSAnLi9yb3V0ZS1jb21wb3Nlci9fdXRpbHMnO1xuaW1wb3J0IHsgX05hdmlnYXRvclhUb2tlbl8gfSBmcm9tICcuL19uYXZpZ2F0aW9uLXguc3ltYm9scyc7XG5pbXBvcnQgdHlwZSB7IFJvdXRlQ29tcG9zZXIgfSBmcm9tICcuL3JvdXRlLWNvbXBvc2VyL3JvdXRlci1jb21wb3Nlcic7XG5pbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25YUm91dGUsIFdpdGhOYXZpZ2F0aW9uWCwgUmVhZG9ubHlSb3V0ZSwgV2l0aFJvdXRlQ29tcG9zZXIgfSBmcm9tICcuL3R5cGVzL2NvbXBvc2FibGUtcm91dGVzLnR5cGVzJztcblxuZnVuY3Rpb24gYXR0ZW1wdFRvUHJvZHVjZUF1dG9OYXZpZ2F0aW9uRnVuY3Rpb25Gb3Iocm91dGVyOiBSb3V0ZXIsIGNvbXBvc2VyPzogUm91dGVDb21wb3Nlcjx1bmtub3duLCBzdHJpbmcsIHN0cmluZz4pOiAoKGVudGl0eTogdW5rbm93bikgPT4gUHJvbWlzZTxib29sZWFuPikgfCB1bmRlZmluZWRcbntcbiAgICBpZiAoIWNvbXBvc2VyKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGNvbXBvc2VyLmhhc0FyZ3MpXG4gICAge1xuICAgICAgICBjb25zdCBjb21wb3NlID0gY29tcG9zZXIuY29tcG9zZS5iaW5kKGNvbXBvc2VyKSBhcyAoZW50aXR5OiB1bmtub3duKSA9PiBzdHJpbmc7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gKGVudGl0eTogdW5rbm93bikgPT4gcm91dGVyLm5hdmlnYXRlQnlVcmwoY29tcG9zZShlbnRpdHkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4gcm91dGVyLm5hdmlnYXRlQnlVcmwoY29tcG9zZXIuY29tcG9zZSgpKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmF2aWdhdGlvblhGYWN0b3J5UHJvdmlkZXIocm91dGU6IFJlYWRvbmx5Um91dGU8c3RyaW5nLCBzdHJpbmcsIGFueT4gJiBXaXRoUm91dGVDb21wb3NlcjxhbnksIHN0cmluZywgc3RyaW5nPiAmIFdpdGhOYXZpZ2F0aW9uWDxhbnksIGFueSwgc3RyaW5nPik6IEZhY3RvcnlQcm92aWRlclxue1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb3ZpZGU6IHJvdXRlWyBfTmF2aWdhdG9yWFRva2VuXyBdLFxuICAgICAgICBkZXBzOiBbUm91dGVyXSxcbiAgICAgICAgdXNlRmFjdG9yeTogKHJvdXRlcjogUm91dGVyKSA9PiBcbiAgICAgICAgeyAgICBcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2VycyA9IGNvbGxlY3RSb3V0ZUNvbXBvc2Vyc0J5QXV0b05hdmlnYXRvck5hbWUocm91dGUpO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICAgICAgICAgIGdldDogKF8sIHByb3BlcnR5TmFtZTogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICBhdHRlbXB0VG9Qcm9kdWNlQXV0b05hdmlnYXRpb25GdW5jdGlvbkZvcihyb3V0ZXIsIGNvbXBvc2Vycy5nZXQocHJvcGVydHlOYW1lKSksXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaGFzOiAoXywgcHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IGNvbXBvc2Vycy5oYXMocHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBwcm92aWRlTmF2aWdhdG9yc0ZvciguLi5yb3V0ZXM6IE5hdmlnYXRpb25YUm91dGU8YW55PltdKTogRmFjdG9yeVByb3ZpZGVyW11cbntcbiAgICBpZiAoIXJvdXRlcz8ubGVuZ3RoKSB0aHJvdyBgTm8gcm91dGVzIHdlcmUgcHJvdmlkZWQuYDtcblxuICAgIHJldHVybiByb3V0ZXMubWFwKGNyZWF0ZU5hdmlnYXRpb25YRmFjdG9yeVByb3ZpZGVyKTtcbn1cblxuXG4vKipcbiAqIFdyYXBzIEFuZ3VsYXIncyBgcHJvdmlkZVJvdXRlcmAgZnVuY3Rpb24gYW5kIGFkZHMgcHJvdmlkZXJzIGZvciB0aGUgbmF2aWdhdGlvbi14IG1vZHVsZS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge05hdmlnYXRpb25YUm91dGU8YW55PltdfSByb3V0ZXMgVGhlIEFuZ3VsYXIgcm91dGVzIGNvbmZpZyB0cmVlIHRvIGluaXRpYWxpemUgbmF2aWdhdGlvbi14IGZvci5cbiAqIEBwYXJhbSB7Li4uTm9IZWFkPFBhcmFtZXRlcnM8dHlwZW9mIHByb3ZpZGVSb3V0ZXI+Pn0gZmVhdHVyZXMgQWRkdGlvbmFsIGZlYXR1cmVzIHRvIHBhc3MgaW50byBBbmd1bGFyJ3MgYHByb3ZpZGVSb3V0ZXJgIGZ1bmN0aW9uLlxuICogQHJldHVybiB7UHJvdmlkZXJbXX0gVGhlIHByb3ZpZGVycyByZXR1cm5lZCBieSBgcHJvdmlkZVJvdXRlcmAsIGFsb25nIHdpdGggb3RoZXIgcHJvdmlkZXJzIG5lZWRlZCBmb3IgbmF2aWdhdGlvbi14IHRvIHdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlUm91dGVyWChyb3V0ZXM6IE5hdmlnYXRpb25YUm91dGU8YW55PltdLCAuLi5mZWF0dXJlczogTm9IZWFkPFBhcmFtZXRlcnM8dHlwZW9mIHByb3ZpZGVSb3V0ZXI+Pik6IFByb3ZpZGVyW11cbntcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5wcm92aWRlUm91dGVyKHJvdXRlcywgLi4uZmVhdHVyZXMpLFxuICAgICAgICAuLi5wcm92aWRlTmF2aWdhdG9yc0ZvciguLi5yb3V0ZXMpXG4gICAgXTtcbn1cblxuLyoqXG4gKiBXcmFwcyBBbmd1bGFyJ3MgYHByb3ZpZGVSb3V0ZXNgIGZ1bmN0aW9uIGFuZCBhZGRzIHByb3ZpZGVycyBmb3IgdGhlIG5hdmlnYXRpb24teCBtb2R1bGUuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHsuLi5OYXZpZ2F0aW9uWFJvdXRlPGFueT5bXX0gcm91dGVzIFRoZSBBbmd1bGFyIHJvdXRlcyBjb25maWcgdHJlZSB0byBpbml0aWFsaXplIG5hdmlnYXRpb24teCBmb3IuXG4gKiBAcmV0dXJuIHtQcm92aWRlcltdfSBUaGUgcHJvdmlkZXJzIHJldHVybmVkIGJ5IGBwcm92aWRlUm91dGVzYCwgYWxvbmcgd2l0aCBvdGhlciBwcm92aWRlcnMgbmVlZGVkIGZvciBuYXZpZ2F0aW9uLXggdG8gd29yay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVSb3V0ZXNYKC4uLnJvdXRlczogTmF2aWdhdGlvblhSb3V0ZTxhbnk+W10pOiBQcm92aWRlcltdXG57XG4gICAgcmV0dXJuIFtcbiAgICAgICAgLi4ucHJvdmlkZVJvdXRlcyhyb3V0ZXMpLFxuICAgICAgICAuLi5wcm92aWRlTmF2aWdhdG9yc0Zvcihyb3V0ZXMpXG4gICAgXTtcbn1cblxuXG4iXX0=