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