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.

213 lines 16.4 kB
/** * Route Implementation - Functor Laws * Core route primitives and combinators */ import { Some, None } from './types'; /** * Identity function for functor law verification */ export const id = (a) => a; /** * Function composition for functor law verification */ export const compose = (f, g) => (a) => f(g(a)); /** * Creates a route functor that follows categorical laws */ const createRoute = (path, parser, generator, matcher) => { const routeInstance = { path, params: {}, // Will be set during parsing map: (f) => { return createRoute(path, (inputPath) => { const parsed = parser(inputPath); return parsed ? f(parsed) : null; }, (params) => { // For mapped routes, we need to reverse the transformation // This is complex for arbitrary functions, so we'll use the original generator // In practice, this would require bijective functions or additional type info return generator(params); // Type assertion needed here }, matcher); }, matches: matcher, parse: parser, generate: generator }; return routeInstance; }; /** * Literal route - matches exact path */ export const literal = (path) => { return createRoute(path, (inputPath) => (inputPath === path ? {} : null), () => path, (inputPath) => inputPath === path); }; /** * Parameter route - extracts path parameters */ export const param = (template) => { const paramRegex = /:([^/]+)/g; const paramNames = []; let match; while ((match = paramRegex.exec(template)) !== null) { paramNames.push(match[1]); } const pathRegex = new RegExp('^' + template.replace(/:([^/]+)/g, '([^/]+)') + '$'); return createRoute(template, (inputPath) => { const match = pathRegex.exec(inputPath); if (!match) return null; const params = {}; paramNames.forEach((name, index) => { params[name] = match[index + 1]; }); return params; }, (params) => { let result = template; Object.entries(params).forEach(([key, value]) => { result = result.replace(`:${key}`, String(value)); }); return result; }, (inputPath) => pathRegex.test(inputPath)); }; /** * Query route - extracts query parameters */ export const query = (basePath) => { return createRoute(basePath, (inputPath) => { const [path, queryString] = inputPath.split('?'); if (path !== basePath) return null; const params = {}; if (queryString) { const searchParams = new URLSearchParams(queryString); for (const [key, value] of searchParams.entries()) { params[key] = value; } } return params; }, (params) => { const queryString = Object.entries(params) .filter(([_, value]) => value !== undefined) .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`) .join('&'); return queryString ? `${basePath}?${queryString}` : basePath; }, (inputPath) => { const [path] = inputPath.split('?'); return path === basePath; }); }; /** * Wildcard route - catches all paths */ export const wildcard = (pattern) => { const isGlobal = pattern === '*'; const prefix = isGlobal ? '' : pattern.replace('*', ''); return createRoute(pattern, (inputPath) => { if (isGlobal || inputPath.startsWith(prefix)) { return { path: inputPath }; } return null; }, ({ path }) => path, (inputPath) => { return isGlobal || inputPath.startsWith(prefix); }); }; /** * Route Combinators - Algebraic Operations */ /** * Sequence combinator - combines routes in sequence */ export const sequence = (routeA, routeB) => { const combinedPath = `${routeA.path}${routeB.path}`; return createRoute(combinedPath, (inputPath) => { // Try to match the first part const aResult = routeA.parse(inputPath); if (!aResult) return null; // Extract remaining path for second route const remainingPath = inputPath.substring(routeA.path.length); const bResult = routeB.parse(remainingPath); if (!bResult) return null; return { ...aResult, ...bResult }; }, (params) => { return routeA.generate(params) + routeB.generate(params); }, (inputPath) => { return routeA.matches(inputPath) && routeB.matches(inputPath.substring(routeA.path.length)); }); }; /** * Choice combinator - tries routes in order */ export const choice = (routes) => { if (routes.length === 0) { throw new Error('Choice combinator requires at least one route'); } const combinedPath = routes.map(r => r.path).join(' | '); return createRoute(combinedPath, (inputPath) => { for (const route of routes) { const result = route.parse(inputPath); if (result) return result; } return null; }, (params) => { // For generation, we need to know which route to use // This is a limitation of the choice combinator // In practice, we'd need additional type information return routes[0].generate(params); }, (inputPath) => { return routes.some(route => route.matches(inputPath)); }); }; /** * Optional combinator - makes route optional */ export const optional = (route) => { return createRoute(`${route.path}?`, (inputPath) => { const result = route.parse(inputPath); return result !== null ? result : null; }, (params) => { return params ? route.generate(params) : ''; }, (inputPath) => { return inputPath === '' || route.matches(inputPath); }); }; /** * Nested combinator - creates nested routes */ export const nested = (parent, _child) => { return parent.map(parentParams => ({ ...parentParams, child: {} // Will be filled by child route })); }; /** * Route matching utility */ export const matchRoute = (routes, path) => { for (const route of routes) { if (route.matches(path)) { return Some(route); } } return None; }; /** * Type-safe route builder */ export const route = (template) => { if (template.includes(':')) { return param(template); } else if (template.includes('?')) { return query(template.split('?')[0]); } else if (template.includes('*')) { return wildcard(template); } else { return literal(template); } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVyL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBaUIsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVwRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFJLENBQUksRUFBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRXBDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQVUsQ0FBYyxFQUFFLENBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFJLEVBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV6Rjs7R0FFRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQ2xCLElBQVksRUFDWixNQUFrQyxFQUNsQyxTQUFnQyxFQUNoQyxPQUFrQyxFQUN4QixFQUFFO0lBQ1osTUFBTSxhQUFhLEdBQWE7UUFDOUIsSUFBSTtRQUNKLE1BQU0sRUFBRSxFQUFPLEVBQUUsNkJBQTZCO1FBRTlDLEdBQUcsRUFBRSxDQUFJLENBQWMsRUFBWSxFQUFFO1lBQ25DLE9BQU8sV0FBVyxDQUNoQixJQUFJLEVBQ0osQ0FBQyxTQUFpQixFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25DLENBQUMsRUFDRCxDQUFDLE1BQVMsRUFBRSxFQUFFO2dCQUNaLDJEQUEyRDtnQkFDM0QsK0VBQStFO2dCQUMvRSw4RUFBOEU7Z0JBQzlFLE9BQU8sU0FBUyxDQUFDLE1BQWEsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1lBQ2hFLENBQUMsRUFD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