Files
how2ice 005cf56baf
Some checks failed
No response / noResponse (push) Has been cancelled
CI / Continuous releases (push) Has been cancelled
CI / test-dev (macos-latest) (push) Has been cancelled
CI / test-dev (ubuntu-latest) (push) Has been cancelled
CI / test-dev (windows-latest) (push) Has been cancelled
Maintenance / main (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
init project
2025-12-12 14:26:25 +09:00

93 lines
3.1 KiB
TypeScript

export function isNewLocation(url: string) {
url = url.replace(/^\/[a-z]{2}\//, '/');
if (url === '/x' || url === '/x/') {
// skipped if it is the X marketing page
return false;
}
return (
url.startsWith('/x') ||
url.startsWith('/material-ui') ||
url.startsWith('/base') ||
url.startsWith('/joy-ui') ||
url.startsWith('/system')
);
}
export const replaceMaterialLinks = (url: string) => {
if (isNewLocation(url)) {
return url;
}
return url.replace(
/(guides|customization|getting-started|discover-more|experimental-api|migration|integrations)/,
'material-ui/$1',
);
};
export const replaceComponentLinks = (url: string) => {
if (isNewLocation(url)) {
return url;
}
url = url.replace(/\/components\/data-grid/, '/x/react-data-grid');
if (isNewLocation(url)) {
return url;
}
if (url.startsWith('/customization')) {
url = url.replace('customization', 'material-ui/customization');
} else if (url.match(/components\/(icons|material-icons|transitions|pickers|about-the-lab)/)) {
url = url.replace(/\/components\/(.*)/, '/material-ui/$1');
} else {
url = url.replace(/\/components\/(.*)/, '/material-ui/react-$1');
// TODO remove, fix the markdown files to match the URLs
if (!url.match(/\/react-(tabs|breadcrumbs)/)) {
url = url
.replace(/(react-[-a-z]+)(x|ch)es([^a-z-])/, '$1$2$3')
.replace(/(react-[-a-z]+)s([^a-z-])/, '$1$2')
.replace(/(react-[-a-z]+)(x|ch)es$/, '$1$2')
.replace(/(react-[-a-z]+)s$/, '$1')
.replace(/react-trap-focu/, 'react-trap-focus')
.replace(/react-circular-progres/, 'react-circular-progress')
.replace(/react-linear-progres/, 'react-linear-progress')
.replace(/react-progres/, 'react-progress');
}
}
return url;
};
export const replaceAPILinks = (url: string) => {
if (isNewLocation(url) || !url.replace(/^\/[a-zA-Z]{2}\//, '/').startsWith('/api')) {
return url;
}
url = url
.replace(/\/api\/data-grid(.*)/, '/x/api/data-grid$1')
.replace(
/\/api\/(unstable-trap-focus|click-away-listener|no-ssr|portal|textarea-autosize)(.*)/,
'/base-ui/api/$1$2',
)
.replace(/\/api\/([^/]+-unstyled)(.*)/, '/base-ui/api/$1$2');
if (isNewLocation(url)) {
return url;
}
url = url.replace(
/\/api\/(loading-button|tab-list|tab-panel|date-picker|date-time-picker|time-picker|calendar-picker|calendar-picker-skeleton|desktop-picker|mobile-date-picker|month-picker|pickers-day|static-date-picker|year-picker|masonry|timeline|timeline-connector|timeline-content|timeline-dot|timeline-item|timeline-opposite-content|timeline-separator|unstable-trap-focus|tree-item|tree-view)(.*)/,
'/material-ui/api/$1$2',
);
if (isNewLocation(url)) {
return url;
}
return url.replace(/\/api\/(.*)/, '/material-ui/api/$1');
};
export default function replaceUrl(url: string, asPath: string) {
if (isNewLocation(asPath)) {
url = replaceMaterialLinks(replaceAPILinks(replaceComponentLinks(url)));
url = url.replace(/^\/styles\/(.*)/, '/system/styles/$1');
url = url.replace(/^\/([a-z]{2})\/styles\/(.*)/, '/$1/system/styles/$2');
}
return url;
}