UNPKG

ziko

Version:

A versatile JavaScript library offering a rich set of Hyperscript Based UI components, advanced mathematical utilities, interactivity ,animations, client side routing and more ...

76 lines (68 loc) 2.65 kB
export function dynamic_routes_parser(mask, route) { const maskSegments = mask.split("/").filter(Boolean); const routeSegments = route.split("/").filter(Boolean); const params = {}; let i = 0, j = 0; while (i < maskSegments.length && j < routeSegments.length) { const maskSegment = maskSegments[i]; const routeSegment = routeSegments[j]; if (maskSegment.startsWith("[...") && maskSegment.endsWith("]")) { const paramName = maskSegment.slice(4, -1); const remainingMaskSegments = maskSegments.length - i - 1; if (remainingMaskSegments === 0) { params[paramName] = routeSegments.slice(j).join("/"); break; } let requiredSegments = 0; for (let k = i + 1; k < maskSegments.length; k++) { if (!maskSegments[k].endsWith("]+")) requiredSegments++; } const remainingRouteSegments = routeSegments.length - j; const segmentsToConsume = remainingRouteSegments - requiredSegments; if (segmentsToConsume >= 1) { params[paramName] = routeSegments .slice(j, j + segmentsToConsume) .join("/"); j += segmentsToConsume; } else return {}; i++; continue; } if (maskSegment.startsWith("[") && maskSegment.endsWith("]+")) { const paramName = maskSegment.slice(1, -2); if (routeSegment) { params[paramName] = routeSegment; j++; } i++; continue; } if (maskSegment.startsWith("[") && maskSegment.endsWith("]")) { const paramName = maskSegment.slice(1, -1); params[paramName] = routeSegment; } else if (maskSegment !== routeSegment) return {}; i++; j++; } return params; } // console.log("\n=== PARSER TESTS ==="); // console.log(dynamic_routes_parser("/user/[id]+", "/user")); // // 👉 {} // console.log(dynamic_routes_parser("/user/[id]+", "/user/42")); // // 👉 { id: "42" } // console.log(dynamic_routes_parser("/blog/[...slug]", "/blog/2025/oct/post")); // // 👉 { slug: "2025/oct/post" } // console.log( // dynamic_routes_parser("/product/[category]/[id]+", "/product/electronics"), // ); // // 👉 { category: "electronics" } // console.log("\n=== FIX TEST ==="); // console.log(dynamic_routes_parser("/[...slug]/[id]", "/sl1/sl2/9")); // // 👉 { slug: "sl1/sl2", id: "9" } // console.log(dynamic_routes_parser("/[slug]/[...id]", "/sl1/id1/id2")); // // 👉 { slug: "sl1", id: "id1/id2" } // console.log(dynamic_routes_parser("/blog/lang/[lang]/id/[id]", "/blog/lang/en/id/10")); // // 👉 { lang: "en", id: "10" }