2023-12-22 13:27:13 +08:00
|
|
|
// Exports
|
|
|
|
// =============================================================================
|
|
|
|
export const config = {
|
|
|
|
matcher: ['/preview/(index.html)?'],
|
|
|
|
};
|
|
|
|
|
|
|
|
// Rewrite rules shared with local server configurations
|
|
|
|
export const rewriteRules = [
|
|
|
|
// Replace CDN URLs with local paths
|
|
|
|
{
|
|
|
|
match: /https?.*\/CHANGELOG.md/g,
|
|
|
|
replace: '/CHANGELOG.md',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
// CDN versioned default
|
|
|
|
// Ex1: //cdn.com/package-name
|
|
|
|
// Ex2: http://cdn.com/package-name@1.0.0
|
|
|
|
// Ex3: https://cdn.com/package-name@latest
|
|
|
|
match: /(?:https?:)*\/\/.*cdn.*docsify[@\d.latest]*(?=["'])/g,
|
2024-05-22 04:19:21 +08:00
|
|
|
replace: '/dist/docsify.min.js',
|
2023-12-22 13:27:13 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
// CDN paths to local paths
|
|
|
|
// Ex1: //cdn.com/package-name/path/file.js => /path/file.js
|
|
|
|
// Ex2: http://cdn.com/package-name@1.0.0/dist/file.js => /dist/file.js
|
|
|
|
// Ex3: https://cdn.com/package-name@latest/dist/file.js => /dist/file.js
|
2024-05-22 04:19:21 +08:00
|
|
|
match: /(?:https?:)*\/\/.*cdn.*docsify[@\d.latest]*\/(?:dist\/)/g,
|
|
|
|
replace: '/dist/',
|
2023-12-22 13:27:13 +08:00
|
|
|
},
|
|
|
|
];
|
|
|
|
|
|
|
|
// Serve virtual /preview/index.html
|
|
|
|
// Note: See vercel.json for preview routing configuration
|
|
|
|
// 1. Fetch index.html from /docs/ directory
|
|
|
|
// 2. Replace CDN URLs with local paths (see rewriteRules)
|
|
|
|
// 3. Return preview HTML
|
|
|
|
export default async function middleware(request) {
|
|
|
|
const { origin } = new URL(request.url);
|
|
|
|
const indexURL = `${origin}/docs/index.html`;
|
|
|
|
const indexHTML = await fetch(indexURL).then(res => res.text());
|
|
|
|
const previewHTML = rewriteRules.reduce(
|
|
|
|
(html, rule) => html.replace(rule.match, rule.replace),
|
2024-05-29 04:27:29 +08:00
|
|
|
indexHTML,
|
2023-12-22 13:27:13 +08:00
|
|
|
);
|
|
|
|
|
|
|
|
return new Response(previewHTML, {
|
|
|
|
status: 200,
|
|
|
|
headers: {
|
|
|
|
'content-type': 'text/html',
|
|
|
|
'x-robots-tag': 'noindex',
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|