@bespunky/angular-zen
Version:
The Angular tools you always wished were there.
58 lines • 9 kB
JavaScript
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=