| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | /**
 * Object describing application route.
 *
 * @typedef {Object} Route
 * @property {Component} component - React Component constructor.
 * @property {string} path - URL route, required for web routing.
 */
/**
 * A registry for Navigator routes, allowing features to register themselves
 * without needing to create additional inter-feature dependencies.
 */
class RouteRegistry {
    /**
     * Initializes a new RouteRegistry instance.
     */
    constructor() {
        /**
         * The set of registered routes.
         *
         * @private
         */
        this._routeRegistry = new Set();
    }
    /**
     * Returns all registered routes.
     *
     * @returns {Route[]}
     */
    getRoutes() {
        // We use the destructuring operator to 'clone' the route object to
        // prevent modifications from outside (e.g. React Native's Navigator
        // extends it with additional properties).
        return [ ...this._routeRegistry ].map(r => {
            return { ...r };
        });
    }
    /**
     * Returns registered route by name if any.
     *
     * @param {Object} component - The React Component (class) of the route to
     * retrieve.
     * @returns {Route|null}
     */
    getRouteByComponent(component) {
        const route
            = [ ...this._routeRegistry ].find(r => r.component === component);
        // We use destructuring operator to 'clone' route object to prevent
        // modifications from outside (e.g. React Native's Navigator extends
        // it with some additional properties).
        return route ? { ...route } : null;
    }
    /**
     * Adds a route to this registry.
     *
     * @param {Route} route - Route definition object.
     * @returns {void}
     */
    register(route) {
        if (this._routeRegistry.has(route)) {
            throw new Error(`Route ${route.component} is registered already!`);
        }
        this._routeRegistry.add(route);
    }
}
/**
 * The public singleton instance of the RouteRegistry class.
 */
export default new RouteRegistry();
 |