UNPKG

resig.js

Version:

Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.

179 lines 13.5 kB
"use strict"; /** * Router Coalgebra Implementation * Isomorphic router with Signal integration */ Object.defineProperty(exports, "__esModule", { value: true }); exports.treeRouter = exports.router = exports.createTreeRouter = exports.matchRouteTree = exports.createRouterSignal = exports.createRouter = void 0; const types_1 = require("./types"); const signal_1 = require("../core/signal"); const route_1 = require("./route"); const navigation_1 = require("./navigation"); /** * Creates a router coalgebra that maintains isomorphism * between path strings and route states */ const createRouter = (routes, env) => { const routerInstance = { route: (path) => { return (0, route_1.matchRoute)(routes, path); }, generate: (state) => { // Find the first route that can generate a path for this state for (const route of routes) { try { return route.generate(state); } catch { continue; } } throw new Error('No route found for state'); }, current: (0, signal_1.signal)((0, route_1.matchRoute)(routes, env.getCurrentPath())), params: (0, signal_1.signal)((() => { const match = (0, route_1.matchRoute)(routes, env.getCurrentPath()); if (match.tag === 'Some') { const parsed = match.value.parse(env.getCurrentPath()); return parsed; } return null; })()) }; // Update signals when path changes env.onPathChange((newPath) => { const newMatch = (0, route_1.matchRoute)(routes, newPath); routerInstance.current._set(newMatch); if (newMatch.tag === 'Some') { const parsed = newMatch.value.parse(newPath); routerInstance.params._set(parsed); } else { routerInstance.params._set(null); } }); return routerInstance; }; exports.createRouter = createRouter; /** * Creates a reactive router signal */ const createRouterSignal = (routes, env) => { const router = (0, exports.createRouter)(routes, env); const navEffects = (0, navigation_1.createNavigationEffects)(env); const routerSignal = { value: () => router.params.value(), map: (f) => { return router.params.map(f); }, subscribe: (fn) => { return router.params.subscribe(fn); }, route: router.current, params: router.params, navigate: (to) => { return navEffects.push(to); }, back: () => { return navEffects.back(); }, forward: () => { return navEffects.forward(); }, replace: (to) => { return navEffects.replace(to); } }; return routerSignal; }; exports.createRouterSignal = createRouterSignal; /** * Route Tree Matching - for nested routing */ const matchRouteTree = (tree, path) => { // Try to match the current route if (tree.route.matches(path)) { const params = tree.route.parse(path); if (params) { return (0, types_1.Some)({ route: tree.route, params, path }); } } // Try children if they exist if (tree.children) { for (const child of tree.children) { const childMatch = (0, exports.matchRouteTree)(child, path); if (childMatch.tag === 'Some') { return childMatch; } } } return types_1.None; }; exports.matchRouteTree = matchRouteTree; /** * Route Tree Router - for complex nested routing */ const createTreeRouter = (tree, env) => { const currentMatch = (0, signal_1.signal)((0, exports.matchRouteTree)(tree, env.getCurrentPath())); const navEffects = (0, navigation_1.createNavigationEffects)(env); // Update match when path changes env.onPathChange((newPath) => { const newMatch = (0, exports.matchRouteTree)(tree, newPath); currentMatch._set(newMatch); }); const routerSignal = { value: () => { const match = currentMatch.value(); return match.tag === 'Some' ? match.value.params : null; }, map: (f) => { return currentMatch.map(match => match.tag === 'Some' ? f(match.value.params) : f(null)); }, subscribe: (fn) => { return currentMatch.subscribe(match => { fn(match.tag === 'Some' ? match.value.params : null); }); }, route: currentMatch.map(match => match.tag === 'Some' ? (0, types_1.Some)(match.value.route) : types_1.None), params: currentMatch.map(match => match.tag === 'Some' ? match.value.params : null), navigate: (to) => { return navEffects.push(to); }, back: () => { return navEffects.back(); }, forward: () => { return navEffects.forward(); }, replace: (to) => { return navEffects.replace(to); } }; return routerSignal; }; exports.createTreeRouter = createTreeRouter; /** * Router factory with environment detection */ const router = (routes, env) => { const environment = env || (typeof window !== 'undefined' ? require('./navigation').createBrowserNav() : require('./navigation').createNodeNav()); return (0, exports.createRouterSignal)(routes, environment); }; exports.router = router; /** * Tree router factory with environment detection */ const treeRouter = (tree, env) => { const environment = env || (typeof window !== 'undefined' ? require('./navigation').createBrowserNav() : require('./navigation').createNodeNav()); return (0, exports.createTreeRouter)(tree, environment); }; exports.treeRouter = treeRouter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlci9yb3V0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBRUgsbUNBQWdIO0FBQ2hILDJDQUFnRDtBQUVoRCxtQ0FBcUM7QUFDckMsNkNBQXVEO0FBRXZEOzs7R0FHRztBQUNJLE1BQU0sWUFBWSxHQUFHLENBQzFCLE1BQXNCLEVBQ3RCLEdBQWtCLEVBQ0gsRUFBRTtJQUNqQixNQUFNLGNBQWMsR0FBa0I7UUFDcEMsS0FBSyxFQUFFLENBQUMsSUFBWSxFQUF3QixFQUFFO1lBQzVDLE9BQU8sSUFBQSxrQkFBVSxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsUUFBUSxFQUFFLENBQUMsS0FBWSxFQUFVLEVBQUU7WUFDakMsK0RBQStEO1lBQy9ELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQztvQkFDSCxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLFNBQVM7Z0JBQ1gsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sRUFBRSxJQUFBLGVBQU0sRUFBQyxJQUFBLGtCQUFVLEVBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRXpELE1BQU0sRUFBRSxJQUFBLGVBQU0sRUFBQyxDQUFDLEdBQUcsRUFBRTtZQUNuQixNQUFNLEtBQUssR0FBRyxJQUFBLGtCQUFVLEVBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDekIsTUFB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