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.

228 lines 17.2 kB
"use strict"; /** * Route Implementation - Functor Laws * Core route primitives and combinators */ Object.defineProperty(exports, "__esModule", { value: true }); exports.route = exports.matchRoute = exports.nested = exports.optional = exports.choice = exports.sequence = exports.wildcard = exports.query = exports.param = exports.literal = exports.compose = exports.id = void 0; const types_1 = require("./types"); /** * Identity function for functor law verification */ const id = (a) => a; exports.id = id; /** * Function composition for functor law verification */ const compose = (f, g) => (a) => f(g(a)); exports.compose = compose; /** * 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 */ const literal = (path) => { return createRoute(path, (inputPath) => (inputPath === path ? {} : null), () => path, (inputPath) => inputPath === path); }; exports.literal = literal; /** * Parameter route - extracts path parameters */ 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)); }; exports.param = param; /** * Query route - extracts query parameters */ 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; }); }; exports.query = query; /** * Wildcard route - catches all paths */ 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); }); }; exports.wildcard = wildcard; /** * Route Combinators - Algebraic Operations */ /** * Sequence combinator - combines routes in sequence */ 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)); }); }; exports.sequence = sequence; /** * Choice combinator - tries routes in order */ 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)); }); }; exports.choice = choice; /** * Optional combinator - makes route optional */ 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); }); }; exports.optional = optional; /** * Nested combinator - creates nested routes */ const nested = (parent, _child) => { return parent.map(parentParams => ({ ...parentParams, child: {} // Will be filled by child route })); }; exports.nested = nested; /** * Route matching utility */ const matchRoute = (routes, path) => { for (const route of routes) { if (route.matches(path)) { return (0, types_1.Some)(route); } } return types_1.None; }; exports.matchRoute = matchRoute; /** * Type-safe route builder */ const route = (template) => { if (template.includes(':')) { return (0, exports.param)(template); } else if (template.includes('?')) { return (0, exports.query)(template.split('?')[0]); } else if (template.includes('*')) { return (0, exports.wildcard)(template); } else { return (0, exports.literal)(template); } }; exports.route = route; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVyL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILG1DQUFvRDtBQUVwRDs7R0FFRztBQUNJLE1BQU0sRUFBRSxHQUFHLENBQUksQ0FBSSxFQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFBdkIsUUFBQSxFQUFFLE1BQXFCO0FBRXBDOztHQUVHO0FBQ0ksTUFBTSxPQUFPLEdBQUcsQ0FBVSxDQUFjLEVBQUUsQ0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUksRUFBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQTVFLFFBQUEsT0FBTyxXQUFxRTtBQUV6Rjs7R0FFRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQ2xCLElBQVksRUFDWixNQUFrQyxFQUNsQyxTQUFnQyxFQUNoQyxPQUFrQyxFQUN4QixFQUFFO0lBQ1osTUFBTSxhQUFhLEdBQWE7UUFDOUIsSUFBSTtRQUNKLE1BQU0sRUFBRSxFQUFPLEVBQUUsNkJBQTZCO1FBRTlDLEdBQUcsRUFBRSxDQUFJLENBQWMsRUFBWSxFQUFFO1lBQ25DLE9BQU8sV0FBVyxDQUNoQixJQUFJLEVBQ0osQ0FBQyxTQUFpQixFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25DLENBQUMsRUFDRCxDQUFDLE1BQVMsRUFBRSxFQUFFO2dCQUNaLDJEQUEyRDtnQkFDM0QsK0VBQStFO2dCQUMvRSw4RUFBOEU7Z0JBQzlFLE9BQU8sU0FBUyxDQUFDLE1BQWEsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1lBQ2hFLENBQUMsRUFDRCxPQUFPLENBQ1Is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