mirror of
https://github.com/withastro/astro.git
synced 2025-02-03 22:29:08 -05:00
* Redirects spike * Allow redirects in static mode * Support in Netlify as well * Adding a changeset * Rename file * Fix build problem * Refactor to be more modular * Fix location ref * Late test should only run in SSR * Support redirects in Netlify SSR configuration (#7167) * Implement support for dynamic routes in redirects (#7173) * Implement support for dynamic routes in redirects * Remove the .only * No need to special-case redirects in static build * Implement support for redirects config in the Vercel adapter (#7182) * Implement support for redirects config in the Vercel adapter * Remove unused condition * Move to a internal helper package * Add support for the object notation in redirects * Use status 308 for non-GET redirects (#7186) * Implement redirects in Cloudflare (#7198) * Implement redirects in Cloudflare * Fix build * Update tests b/c of new ordering * Debug issue * Use posix.join * Update packages/underscore-redirects/package.json Co-authored-by: Emanuele Stoppa <my.burning@gmail.com> * Update based on review comments * Update broken test --------- Co-authored-by: Emanuele Stoppa <my.burning@gmail.com> * Test that redirects can come from middleware (#7213) * Test that redirects can come from middleware * Allow non-promise returns for middleware * Implement priority (#7210) * Refactor * Fix netlify test ordering * Fix ordering again * Redirects: Allow preventing the output of the static HTML file (#7245) * Do a simple push for priority * Adding changesets * Put the implementation behind a flag. * Self review * Update .changeset/chatty-actors-stare.md Co-authored-by: Chris Swithinbank <swithinbank@gmail.com> * Update packages/astro/src/@types/astro.ts Co-authored-by: Chris Swithinbank <swithinbank@gmail.com> * Update packages/astro/src/@types/astro.ts Co-authored-by: Chris Swithinbank <swithinbank@gmail.com> * Update packages/astro/src/@types/astro.ts Co-authored-by: Chris Swithinbank <swithinbank@gmail.com> * Update packages/astro/src/@types/astro.ts Co-authored-by: Chris Swithinbank <swithinbank@gmail.com> * Update docs on dynamic restrictions. * Update packages/astro/src/@types/astro.ts Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> * Update packages/astro/src/@types/astro.ts Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> * Code review changes * Document netlify static adapter * Update packages/astro/src/@types/astro.ts Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> * Slight reword * Update .changeset/twenty-suns-vanish.md Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> * Add a note about public/_redirects file * Update packages/astro/src/@types/astro.ts Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> --------- Co-authored-by: Emanuele Stoppa <my.burning@gmail.com> Co-authored-by: Chris Swithinbank <swithinbank@gmail.com> Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
86 lines
2.2 KiB
TypeScript
86 lines
2.2 KiB
TypeScript
/**
|
|
* A set of common path utilities commonly used through the Astro core and integration
|
|
* projects. These do things like ensure a forward slash prepends paths.
|
|
*/
|
|
|
|
export function appendExtension(path: string, extension: string) {
|
|
return path + '.' + extension;
|
|
}
|
|
|
|
export function appendForwardSlash(path: string) {
|
|
return path.endsWith('/') ? path : path + '/';
|
|
}
|
|
|
|
export function prependForwardSlash(path: string) {
|
|
return path[0] === '/' ? path : '/' + path;
|
|
}
|
|
|
|
export function removeTrailingForwardSlash(path: string) {
|
|
return path.endsWith('/') ? path.slice(0, path.length - 1) : path;
|
|
}
|
|
|
|
export function removeLeadingForwardSlash(path: string) {
|
|
return path.startsWith('/') ? path.substring(1) : path;
|
|
}
|
|
|
|
export function removeLeadingForwardSlashWindows(path: string) {
|
|
return path.startsWith('/') && path[2] === ':' ? path.substring(1) : path;
|
|
}
|
|
|
|
export function trimSlashes(path: string) {
|
|
return path.replace(/^\/|\/$/g, '');
|
|
}
|
|
|
|
export function startsWithForwardSlash(path: string) {
|
|
return path[0] === '/';
|
|
}
|
|
|
|
export function startsWithDotDotSlash(path: string) {
|
|
const c1 = path[0];
|
|
const c2 = path[1];
|
|
const c3 = path[2];
|
|
return c1 === '.' && c2 === '.' && c3 === '/';
|
|
}
|
|
|
|
export function startsWithDotSlash(path: string) {
|
|
const c1 = path[0];
|
|
const c2 = path[1];
|
|
return c1 === '.' && c2 === '/';
|
|
}
|
|
|
|
export function isRelativePath(path: string) {
|
|
return startsWithDotDotSlash(path) || startsWithDotSlash(path);
|
|
}
|
|
|
|
function isString(path: unknown): path is string {
|
|
return typeof path === 'string' || path instanceof String;
|
|
}
|
|
|
|
export function joinPaths(...paths: (string | undefined)[]) {
|
|
return paths
|
|
.filter(isString)
|
|
.map((path, i) => {
|
|
if (i === 0) {
|
|
return removeTrailingForwardSlash(path);
|
|
} else if (i === paths.length - 1) {
|
|
return removeLeadingForwardSlash(path);
|
|
} else {
|
|
return trimSlashes(path);
|
|
}
|
|
})
|
|
.join('/');
|
|
}
|
|
|
|
export function removeFileExtension(path: string) {
|
|
let idx = path.lastIndexOf('.');
|
|
return idx === -1 ? path : path.slice(0, idx);
|
|
}
|
|
|
|
export function removeQueryString(path: string) {
|
|
const index = path.lastIndexOf('?');
|
|
return index > 0 ? path.substring(0, index) : path;
|
|
}
|
|
|
|
export function isRemotePath(src: string) {
|
|
return /^(http|ftp|https|ws):?\/\//.test(src) || src.startsWith('data:');
|
|
}
|