Skip to content

Commit

Permalink
Merge branch 'master' into yarn-2-e2e-test
Browse files Browse the repository at this point in the history
  • Loading branch information
SamChou19815 committed Jul 1, 2020
2 parents ec7e6f8 + 998e4d5 commit 1f54664
Show file tree
Hide file tree
Showing 27 changed files with 550 additions and 297 deletions.
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ packages/docusaurus-plugin-content-pages/lib/
packages/docusaurus-plugin-debug/lib/
packages/docusaurus-plugin-sitemap/lib/
packages/docusaurus-plugin-ideal-image/lib/
packages/docusaurus-theme-classic/lib/
__fixtures__
4 changes: 2 additions & 2 deletions docs/api-site-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ headerLinks: [
{ doc: "doc1", label: "Getting Started" },
// Link to page found at pages/en/help.js or if that does not exist, pages/help.js, for current language
{ page: "help", label: "Help" },
// Links to href destination
{ href: "https://github.com/", label: "GitHub" },
// Links to href destination, using target=_blank (external)
{ href: "https://github.com/", label: "GitHub", external: true },
// Links to blog generated by Docusaurus (${baseUrl}blog)
{ blog: true, label: "Blog" },
// Determines search bar position among links
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ import {removeTrailingSlash} from '@docusaurus/utils';

function createTestPluginContext(
options?: UserPluginOptions,
routesPaths: string[] = [],
relativeRoutesPaths: string[] = [],
): PluginContext {
return {
outDir: '/tmp',
baseUrl: 'https://docusaurus.io',
routesPaths,
relativeRoutesPaths,
options: normalizePluginOptions(options),
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,32 @@ const createExtensionValidationTests = (
extensionRedirectCreatorFn: (
paths: string[],
extensions: string[],
baseUrl: string,
) => RedirectMetadata[],
) => {
test('should reject empty extensions', () => {
expect(() => {
extensionRedirectCreatorFn(['/'], ['.html'], '/');
extensionRedirectCreatorFn(['/'], ['.html']);
}).toThrowErrorMatchingInlineSnapshot(
`"Extension=['.html'] contains a . (dot) and is not allowed. If the redirect extension system is not good enough for your usecase, you can create redirects yourself with the 'createRedirects' plugin option."`,
);
});
test('should reject extensions with .', () => {
expect(() => {
extensionRedirectCreatorFn(['/'], ['.html'], '/');
extensionRedirectCreatorFn(['/'], ['.html']);
}).toThrowErrorMatchingInlineSnapshot(
`"Extension=['.html'] contains a . (dot) and is not allowed. If the redirect extension system is not good enough for your usecase, you can create redirects yourself with the 'createRedirects' plugin option."`,
);
});
test('should reject extensions with /', () => {
expect(() => {
extensionRedirectCreatorFn(['/'], ['ht/ml'], '/');
extensionRedirectCreatorFn(['/'], ['ht/ml']);
}).toThrowErrorMatchingInlineSnapshot(
`"Extension=['ht/ml'] contains a / and is not allowed. If the redirect extension system is not good enough for your usecase, you can create redirects yourself with the 'createRedirects' plugin option."`,
);
});
test('should reject extensions with illegal url char', () => {
expect(() => {
extensionRedirectCreatorFn(['/'], [','], '/');
extensionRedirectCreatorFn(['/'], [',']);
}).toThrowErrorMatchingInlineSnapshot(
`"Extension=[','] contains invalid uri characters. If the redirect extension system is not good enough for your usecase, you can create redirects yourself with the 'createRedirects' plugin option."`,
);
Expand All @@ -53,28 +52,28 @@ describe('createToExtensionsRedirects', () => {

test('should create redirects from html/htm extensions', () => {
const ext = ['html', 'htm'];
expect(createToExtensionsRedirects([''], ext, '/')).toEqual([]);
expect(createToExtensionsRedirects(['/'], ext, '/')).toEqual([]);
expect(createToExtensionsRedirects(['/abc.html'], ext, '/')).toEqual([
expect(createToExtensionsRedirects([''], ext)).toEqual([]);
expect(createToExtensionsRedirects(['/'], ext)).toEqual([]);
expect(createToExtensionsRedirects(['/abc.html'], ext)).toEqual([
{from: '/abc', to: '/abc.html'},
]);
expect(createToExtensionsRedirects(['/abc.htm'], ext, '/')).toEqual([
expect(createToExtensionsRedirects(['/abc.htm'], ext)).toEqual([
{from: '/abc', to: '/abc.htm'},
]);
expect(createToExtensionsRedirects(['/abc.xyz'], ext, '/')).toEqual([]);
expect(createToExtensionsRedirects(['/abc.xyz'], ext)).toEqual([]);
});

test('should create "to" redirects without baseUrl when baseUrl is used', () => {
test('should create "to" redirects when relativeRoutesPath contains a prefix', () => {
expect(
createToExtensionsRedirects(['/prefix/file.html'], ['html'], '/prefix/'),
).toEqual([{from: '/file', to: '/file.html'}]);
createToExtensionsRedirects(['/prefix/file.html'], ['html']),
).toEqual([{from: '/prefix/file', to: '/prefix/file.html'}]);
});

test('should not create redirection for an empty extension array', () => {
const ext: string[] = [];
expect(createToExtensionsRedirects([''], ext, '/')).toEqual([]);
expect(createToExtensionsRedirects(['/'], ext, '/')).toEqual([]);
expect(createToExtensionsRedirects(['/abc.html'], ext, '/')).toEqual([]);
expect(createToExtensionsRedirects([''], ext)).toEqual([]);
expect(createToExtensionsRedirects(['/'], ext)).toEqual([]);
expect(createToExtensionsRedirects(['/abc.html'], ext)).toEqual([]);
});
});

Expand All @@ -83,28 +82,28 @@ describe('createFromExtensionsRedirects', () => {

test('should create redirects to html/htm extensions', () => {
const ext = ['html', 'htm'];
expect(createFromExtensionsRedirects([''], ext, '/')).toEqual([]);
expect(createFromExtensionsRedirects(['/'], ext, '/')).toEqual([]);
expect(createFromExtensionsRedirects(['/abc'], ext, '/')).toEqual([
expect(createFromExtensionsRedirects([''], ext)).toEqual([]);
expect(createFromExtensionsRedirects(['/'], ext)).toEqual([]);
expect(createFromExtensionsRedirects(['/abc'], ext)).toEqual([
{from: '/abc.html', to: '/abc'},
{from: '/abc.htm', to: '/abc'},
]);
expect(createFromExtensionsRedirects(['/def.html'], ext, '/')).toEqual([]);
expect(createFromExtensionsRedirects(['/def/'], ext, '/')).toEqual([]);
expect(createFromExtensionsRedirects(['/def.html'], ext)).toEqual([]);
expect(createFromExtensionsRedirects(['/def/'], ext)).toEqual([]);
});

test('should create "from" redirects without baseUrl when baseUrl is used', () => {
expect(
createFromExtensionsRedirects(['/prefix/file'], ['html'], '/prefix/'),
).toEqual([{from: '/file.html', to: '/file'}]);
test('should create "from" redirects when relativeRoutesPath contains a prefix', () => {
expect(createFromExtensionsRedirects(['/prefix/file'], ['html'])).toEqual([
{from: '/prefix/file.html', to: '/prefix/file'},
]);
});

test('should not create redirection for an empty extension array', () => {
const ext: string[] = [];
expect(createFromExtensionsRedirects([''], ext, '/')).toEqual([]);
expect(createFromExtensionsRedirects(['/'], ext, '/')).toEqual([]);
expect(createFromExtensionsRedirects(['/abc'], ext, '/')).toEqual([]);
expect(createFromExtensionsRedirects(['/def.html'], ext, '/')).toEqual([]);
expect(createFromExtensionsRedirects(['/def/'], ext, '/')).toEqual([]);
expect(createFromExtensionsRedirects([''], ext)).toEqual([]);
expect(createFromExtensionsRedirects(['/'], ext)).toEqual([]);
expect(createFromExtensionsRedirects(['/abc'], ext)).toEqual([]);
expect(createFromExtensionsRedirects(['/def.html'], ext)).toEqual([]);
expect(createFromExtensionsRedirects(['/def/'], ext)).toEqual([]);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,7 @@ function validateCollectedRedirects(
);
}

const allowedToPaths = pluginContext.routesPaths.map((path) =>
path.replace(pluginContext.baseUrl, '/'),
);
const allowedToPaths = pluginContext.relativeRoutesPaths;
const toPaths = redirects.map((redirect) => redirect.to);
const illegalToPaths = difference(toPaths, allowedToPaths);
if (illegalToPaths.length > 0) {
Expand Down Expand Up @@ -91,7 +89,7 @@ It is not possible to redirect the same pathname to multiple destinations:

// We don't want to override an already existing route with a redirect file!
const redirectsOverridingExistingPath = redirects.filter((redirect) =>
pluginContext.routesPaths.includes(redirect.from),
pluginContext.relativeRoutesPaths.includes(redirect.from),
);
if (redirectsOverridingExistingPath.length > 0) {
console.error(
Expand All @@ -103,7 +101,7 @@ It is not possible to redirect the same pathname to multiple destinations:
);
}
redirects = redirects.filter(
(redirect) => !pluginContext.routesPaths.includes(redirect.from),
(redirect) => !pluginContext.relativeRoutesPaths.includes(redirect.from),
);

return redirects;
Expand All @@ -113,18 +111,16 @@ It is not possible to redirect the same pathname to multiple destinations:
function doCollectRedirects(pluginContext: PluginContext): RedirectMetadata[] {
return [
...createFromExtensionsRedirects(
pluginContext.routesPaths,
pluginContext.relativeRoutesPaths,
pluginContext.options.fromExtensions,
pluginContext.baseUrl,
),
...createToExtensionsRedirects(
pluginContext.routesPaths,
pluginContext.relativeRoutesPaths,
pluginContext.options.toExtensions,
pluginContext.baseUrl,
),
...createRedirectsOptionRedirects(pluginContext.options.redirects),
...createCreateRedirectsOptionRedirects(
pluginContext.routesPaths,
pluginContext.relativeRoutesPaths,
pluginContext.options.createRedirects,
),
];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ const addLeadingDot = (extension: string) => `.${extension}`;
export function createToExtensionsRedirects(
paths: string[],
extensions: string[],
baseUrl: string,
): RedirectMetadata[] {
extensions.forEach(validateExtension);

Expand All @@ -54,8 +53,8 @@ export function createToExtensionsRedirects(
if (extensionFound) {
const routePathWithoutExtension = removeSuffix(path, extensionFound);
return [routePathWithoutExtension].map((from) => ({
from: trimBaseUrl(from, baseUrl),
to: trimBaseUrl(path, baseUrl),
from,
to: path,
}));
}
return [];
Expand All @@ -68,7 +67,6 @@ export function createToExtensionsRedirects(
export function createFromExtensionsRedirects(
paths: string[],
extensions: string[],
baseUrl: string,
): RedirectMetadata[] {
extensions.forEach(validateExtension);

Expand All @@ -82,14 +80,10 @@ export function createFromExtensionsRedirects(
return [];
}
return extensions.map((ext) => ({
from: `${trimBaseUrl(path, baseUrl)}.${ext}`,
to: trimBaseUrl(path, baseUrl),
from: `${path}.${ext}`,
to: path,
}));
};

return flatten(paths.map(createPathRedirects));
}

function trimBaseUrl(path: string, baseUrl: string) {
return path.startsWith(baseUrl) ? path.replace(baseUrl, '/') : path;
}
5 changes: 4 additions & 1 deletion packages/docusaurus-plugin-client-redirects/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import writeRedirectFiles, {
toRedirectFilesMetadata,
RedirectFileMetadata,
} from './writeRedirectFiles';
import {removePrefix} from '@docusaurus/utils';

export default function pluginClientRedirectsPages(
_context: LoadContext,
Expand All @@ -25,7 +26,9 @@ export default function pluginClientRedirectsPages(
name: 'docusaurus-plugin-client-redirects',
async postBuild(props: Props) {
const pluginContext: PluginContext = {
routesPaths: props.routesPaths,
relativeRoutesPaths: props.routesPaths.map(
(path) => `/${removePrefix(path, props.baseUrl)}`,
),
baseUrl: props.baseUrl,
outDir: props.outDir,
options,
Expand Down
6 changes: 2 additions & 4 deletions packages/docusaurus-plugin-client-redirects/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,9 @@ export type RedirectOption = {
export type UserPluginOptions = Partial<PluginOptions>;

// The minimal infos the plugin needs to work
export type PluginContext = Pick<
Props,
'routesPaths' | 'outDir' | 'baseUrl'
> & {
export type PluginContext = Pick<Props, 'outDir' | 'baseUrl'> & {
options: PluginOptions;
relativeRoutesPaths: string[];
};

// In-memory representation of redirects we want: easier to test
Expand Down
11 changes: 3 additions & 8 deletions packages/docusaurus-plugin-content-docs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -381,23 +381,18 @@ Available document ids=
// (/docs, /docs/next, /docs/1.0 etc...)
// The component applies the layout and renders the appropriate doc
const addBaseRoute = async (
docsBaseRoute: string,
docsBasePath: string,
docsBaseMetadata: DocsBaseMetadata,
routes: RouteConfig[],
priority?: number,
) => {
const docsBaseMetadataPath = await createData(
`${docuHash(normalizeUrl([docsBaseRoute, ':route']))}.json`,
`${docuHash(normalizeUrl([docsBasePath, ':route']))}.json`,
JSON.stringify(docsBaseMetadata, null, 2),
);

// Important: the layout component should not end with /,
// as it conflicts with the home doc
// Workaround fix for https://github.com/facebook/docusaurus/issues/2917
const docsPath = docsBaseRoute === '/' ? '' : docsBaseRoute;

addRoute({
path: docsPath,
path: docsBasePath,
exact: false, // allow matching /docs/* as well
component: docLayoutComponent, // main docs component (DocPage)
routes, // subroute for each doc
Expand Down
Loading

0 comments on commit 1f54664

Please sign in to comment.