mirror of
https://github.com/CopilotKit/CopilotKit.git
synced 2026-09-14 16:26:20 +08:00
e9e6fbdd85
Co-authored-by: Max Korp <maxkorp@8bytealchemy.com> Co-authored-by: Santiago Cubino <scubino@litebox.ai> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
78 lines
2.7 KiB
TypeScript
78 lines
2.7 KiB
TypeScript
import { INTEGRATION_ORDER } from './integrations';
|
|
|
|
/**
|
|
* Normalizes URLs by converting integration routes from /integrations/{integration}/... to /{integration}/...
|
|
* Also normalizes trailing slashes (removes them except for root).
|
|
* Only normalizes known integration routes to ensure consistency.
|
|
*
|
|
* Examples:
|
|
* - /integrations/langgraph → /langgraph
|
|
* - /integrations/langgraph/shared-state → /langgraph/shared-state
|
|
* - /langgraph/ → /langgraph
|
|
* - /langgraph → /langgraph (already canonical)
|
|
* - /reference → /reference (not an integration, unchanged)
|
|
*
|
|
* Use this for href attributes and canonical URLs.
|
|
*/
|
|
export function normalizeUrl(url: string): string {
|
|
if (!url) return url;
|
|
|
|
// Split the URL into segments
|
|
const segments = url.split('/').filter(Boolean);
|
|
|
|
// Check if first segment is 'integrations'
|
|
if (segments[0] === 'integrations' && segments.length > 1) {
|
|
const integrationId = segments[1];
|
|
|
|
// Check if this is a known integration
|
|
if (INTEGRATION_ORDER.includes(integrationId as typeof INTEGRATION_ORDER[number])) {
|
|
// Reconstruct as canonical URL: /{integration}/{rest of path}
|
|
const restOfPath = segments.slice(2).join('/');
|
|
const normalized = `/${integrationId}${restOfPath ? '/' + restOfPath : ''}`;
|
|
|
|
// Remove trailing slash (except for root)
|
|
return normalized === '/' ? '/' : normalized.replace(/\/$/, '');
|
|
}
|
|
}
|
|
|
|
// If not an integration route, normalize trailing slashes
|
|
return url === '/' ? '/' : url.replace(/\/$/, '');
|
|
}
|
|
|
|
/**
|
|
* Normalizes URLs for matching/comparison purposes.
|
|
*
|
|
* This function:
|
|
* 1. First normalizes integration URLs (via normalizeUrl)
|
|
* 2. Handles relative paths (../)
|
|
* 3. Ensures consistent trailing slash handling
|
|
*
|
|
* Use this for comparing URLs (e.g., active state detection).
|
|
*
|
|
* Examples:
|
|
* - ../langgraph → /langgraph
|
|
* - /integrations/langgraph/ → /langgraph
|
|
* - /langgraph/index → /langgraph/index (preserved for index matching logic)
|
|
*/
|
|
export function normalizeUrlForMatching(url: string): string {
|
|
if (!url) return '';
|
|
|
|
// Handle relative URLs (simplified - assumes they resolve to absolute)
|
|
let normalized = url.startsWith('../') ? url.replace(/^\.\.\//, '/') : url;
|
|
|
|
// First normalize integration URLs and trailing slashes
|
|
normalized = normalizeUrl(normalized);
|
|
|
|
// Remove trailing slashes (except for root) for consistent matching
|
|
// Note: We preserve /index for index page matching logic
|
|
return normalized === '/' ? '/' : normalized.replace(/\/$/, '');
|
|
}
|
|
|
|
/**
|
|
* Normalizes pathnames for analytics tracking.
|
|
* Alias for normalizeUrl for clarity in analytics context.
|
|
*/
|
|
export function normalizePathnameForAnalytics(pathname: string): string {
|
|
return normalizeUrl(pathname);
|
|
}
|