ts-routes
Version:
Strongly typed routes management
111 lines (99 loc) • 3.96 kB
JavaScript
import { compile } from 'path-to-regexp';
import { stringify, parse } from 'qs';
function createRouting(routes, options) {
function createRoute(currentPattern, { pattern: pattern2, children }) {
const pattern = currentPattern + pattern2.pattern;
const compiledPattern = compile(pattern);
function route(pathParams, queryParams, overrideOptions) {
const queryString = queryParams ? `?${stringify(queryParams, overrideOptions !== null && overrideOptions !== void 0 ? overrideOptions : options)}` : "";
return compiledPattern(pathParams) + queryString;
}
route.pattern = pattern;
route.parseQuery = (query, overrideOptions) => parse(query, overrideOptions !== null && overrideOptions !== void 0 ? overrideOptions : options);
if (children) {
for (const childRoute in children) {
route[childRoute] = createRoute(pattern, children[childRoute]);
}
}
return route;
}
const mappedRoutes = {};
for (const route in routes) {
mappedRoutes[route] = createRoute("", routes[route]);
}
return mappedRoutes;
}
class SegmentPattern {
constructor(pattern, params) {
this.pattern = pattern;
this.params = params;
}
}
function segment(literals, ...placeholders) {
let result = "";
for (let i = 0; i < placeholders.length; i++) {
result += literals[i];
result += placeholders[i].pattern;
}
result += literals[literals.length - 1];
return {
pattern: new SegmentPattern(result, placeholders),
};
}
class PathParamDescription {
constructor({ name, optionality, pattern }) {
const patternPart = pattern ? `(${pattern})` : "";
const requirementPart = optionality === "optional" ? "?" : "";
this.name = name;
this.optionality = optionality;
this.pattern = `:${name}${patternPart}${requirementPart}`;
}
}
function string(name, optsOrOptionality) {
var _a;
let optionality;
if (typeof optsOrOptionality === "string") {
optionality = optsOrOptionality;
}
else {
optionality = (_a = optsOrOptionality === null || optsOrOptionality === void 0 ? void 0 : optsOrOptionality.optionality) !== null && _a !== void 0 ? _a : "required";
}
return new PathParamDescription({ name, optionality });
}
function uuid$1(name, optsOrOptionality) {
var _a;
let optionality;
if (typeof optsOrOptionality === "string") {
optionality = optsOrOptionality;
}
else {
optionality = (_a = optsOrOptionality === null || optsOrOptionality === void 0 ? void 0 : optsOrOptionality.optionality) !== null && _a !== void 0 ? _a : "required";
}
const number = "[0-9]+";
return new PathParamDescription({ name, optionality, pattern: number });
}
function uuid(name, optsOrOptionality) {
var _a;
let optionality;
if (typeof optsOrOptionality === "string") {
optionality = optsOrOptionality;
}
else {
optionality = (_a = optsOrOptionality === null || optsOrOptionality === void 0 ? void 0 : optsOrOptionality.optionality) !== null && _a !== void 0 ? _a : "required";
}
const uuid = "[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}";
return new PathParamDescription({ name, optionality, pattern: uuid });
}
function arg(name, { pattern, optionality = "required", } = {}) {
return new PathParamDescription({ name, optionality, pattern });
}
class QueryParamDescription {
constructor(optionality) {
this.optionality = optionality;
}
}
function query(optionality = "required") {
return new QueryParamDescription(optionality);
}
export { arg, createRouting, uuid$1 as number, query, segment, string, uuid };
//# sourceMappingURL=index.esm.js.map