fix(utils): always match exclusion root dirs as complete folder paths (#7864)

* fix(utils): always match exclusion root dirs as complete folder paths

* fix

* fix?

* fix for real
This commit is contained in:
Joshua Chen 2022-08-01 15:23:01 +08:00 committed by GitHub
parent 3a0e90eacd
commit 40827c6c72
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 35 additions and 5 deletions

View file

@ -113,4 +113,21 @@ describe('createAbsoluteFilePathMatcher', () => {
`"createAbsoluteFilePathMatcher unexpected error, absoluteFilePath=/bad/path/myDoc.md was not contained in any of the root folders: /_root/docs, /root/_docs/, /__test__/website/src"`,
);
});
it('matches paths with overlapping paths', () => {
const overlapMatcher = createAbsoluteFilePathMatcher(GlobExcludeDefault, [
'/root/docs',
'/root/versioned_docs/version-2.0.0',
'/root/versioned_docs/version-2.0.0-rc.1',
]);
expect(
overlapMatcher('/root/versioned_docs/version-2.0.0-rc.1/_partial.mdx'),
).toBe(true);
expect(
overlapMatcher('/root/versioned_docs/version-2.0.0/_partial.mdx'),
).toBe(true);
expect(
overlapMatcher('/root/versioned_docs/version-2.0.0/no-partial.mdx'),
).toBe(false);
});
});

View file

@ -9,6 +9,7 @@
import path from 'path';
import Micromatch from 'micromatch'; // Note: Micromatch is used by Globby
import {addSuffix} from './jsUtils';
/** A re-export of the globby instance. */
export {default as Globby} from 'globby';
@ -68,7 +69,9 @@ export function createAbsoluteFilePathMatcher(
function getRelativeFilePath(absoluteFilePath: string) {
const rootFolder = rootFolders.find((folderPath) =>
absoluteFilePath.startsWith(folderPath),
[addSuffix(folderPath, '/'), addSuffix(folderPath, '\\')].some((p) =>
absoluteFilePath.startsWith(p),
),
);
if (!rootFolder) {
throw new Error(

View file

@ -5,6 +5,16 @@
* LICENSE file in the root directory of this source tree.
*/
/** Adds a given string prefix to `str`. */
export function addPrefix(str: string, prefix: string): string {
return str.startsWith(prefix) ? str : `${prefix}${str}`;
}
/** Adds a given string suffix to `str`. */
export function addSuffix(str: string, suffix: string): string {
return str.endsWith(suffix) ? str : `${str}${suffix}`;
}
/** Removes a given string suffix from `str`. */
export function removeSuffix(str: string, suffix: string): string {
if (suffix === '') {

View file

@ -119,5 +119,5 @@ export function addTrailingPathSeparator(str: string): string {
return str.endsWith(path.sep)
? str
: // If this is Windows, we need to change the forward slash to backward
`${str.replace(/\/$/, '')}${path.sep}`;
`${str.replace(/[\\/]$/, '')}${path.sep}`;
}

View file

@ -6,7 +6,7 @@
*/
import resolvePathnameUnsafe from 'resolve-pathname';
import {removeSuffix} from './jsUtils';
import {addPrefix, addSuffix, removeSuffix} from './jsUtils';
/**
* Much like `path.join`, but much better. Takes an array of URL segments, and
@ -175,13 +175,13 @@ export function resolvePathname(to: string, from?: string): string {
}
/** Appends a leading slash to `str`, if one doesn't exist. */
export function addLeadingSlash(str: string): string {
return str.startsWith('/') ? str : `/${str}`;
return addPrefix(str, '/');
}
// TODO deduplicate: also present in @docusaurus/utils-common
/** Appends a trailing slash to `str`, if one doesn't exist. */
export function addTrailingSlash(str: string): string {
return str.endsWith('/') ? str : `${str}/`;
return addSuffix(str, '/');
}
/** Removes the trailing slash from `str`. */