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