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
JavaScript
;
/**
* 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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