From ae5e261da56f90d1b1e0881ae2c9e9717ef8d63b Mon Sep 17 00:00:00 2001 From: Daniel Lautzenheiser Date: Thu, 7 Sep 2023 08:06:04 -0400 Subject: [PATCH] feat: filter entry list from github before reading files (#868) --- packages/core/src/backend.ts | 23 ++++++++++++++++++- .../backends/git-gateway/implementation.tsx | 4 ++-- .../src/backends/github/implementation.tsx | 8 +++++-- packages/core/src/interface.ts | 1 + 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/core/src/backend.ts b/packages/core/src/backend.ts index 89c9b323..181aa711 100644 --- a/packages/core/src/backend.ts +++ b/packages/core/src/backend.ts @@ -15,6 +15,7 @@ import { getI18nEntry, getI18nFiles, getI18nFilesDepth, + getI18nInfo, groupEntries, hasI18n, } from './lib/i18n'; @@ -292,6 +293,21 @@ function collectionDepth(collection: Collection) { return depth; } +function collectionRegex(collection: Collection): RegExp | undefined { + let ruleString = ''; + + if ('folder' in collection && collection.path) { + ruleString = `${collection.folder}/${collection.path}`.replace(/{{.*}}/gm, '(.*)'); + } + + if (hasI18n(collection)) { + const { defaultLocale } = getI18nInfo(collection); + ruleString += `\\.${defaultLocale}\\..*`; + } + + return ruleString ? new RegExp(ruleString) : undefined; +} + export class Backend { implementation: BC; backendName: string; @@ -513,7 +529,12 @@ export class Backend this.processEntries(entries, collection)); } diff --git a/packages/core/src/backends/git-gateway/implementation.tsx b/packages/core/src/backends/git-gateway/implementation.tsx index 63ae8301..ed873662 100644 --- a/packages/core/src/backends/git-gateway/implementation.tsx +++ b/packages/core/src/backends/git-gateway/implementation.tsx @@ -376,8 +376,8 @@ export default class GitGateway implements BackendClass { async entriesByFolder(folder: string, extension: string, depth: number) { return this.backend!.entriesByFolder(folder, extension, depth); } - allEntriesByFolder(folder: string, extension: string, depth: number) { - return this.backend!.allEntriesByFolder(folder, extension, depth); + allEntriesByFolder(folder: string, extension: string, depth: number, pathRegex?: RegExp) { + return this.backend!.allEntriesByFolder(folder, extension, depth, pathRegex); } entriesByFiles(files: ImplementationFile[]) { return this.backend!.entriesByFiles(files); diff --git a/packages/core/src/backends/github/implementation.tsx b/packages/core/src/backends/github/implementation.tsx index ae858634..4cb5a825 100644 --- a/packages/core/src/backends/github/implementation.tsx +++ b/packages/core/src/backends/github/implementation.tsx @@ -272,14 +272,18 @@ export default class GitHub implements BackendClass { return files; } - async allEntriesByFolder(folder: string, extension: string, depth: number) { + async allEntriesByFolder(folder: string, extension: string, depth: number, pathRegex?: RegExp) { const repoURL = this.api!.originRepoURL; const listFiles = () => this.api!.listFiles(folder, { repoURL, depth, - }).then(files => files.filter(file => filterByExtension(file, extension))); + }).then(files => + files.filter( + file => (!pathRegex || pathRegex.test(file.path)) && filterByExtension(file, extension), + ), + ); const readFile = (path: string, id: string | null | undefined) => { return this.api!.readFile(path, id, { repoURL }) as Promise; diff --git a/packages/core/src/interface.ts b/packages/core/src/interface.ts index f982ed0a..9d143ccf 100644 --- a/packages/core/src/interface.ts +++ b/packages/core/src/interface.ts @@ -554,6 +554,7 @@ export abstract class BackendClass { folder: string, extension: string, depth: number, + pathRegex?: RegExp, ): Promise; abstract traverseCursor( cursor: Cursor,