From 18ef773f35db1b7ef3ab5a0f25527d87745b9c73 Mon Sep 17 00:00:00 2001 From: Anze Demsar Date: Thu, 31 Aug 2023 11:45:26 +0200 Subject: [PATCH] perf(): filter by path when loading collection from github backend (#6898) --- .../src/implementation.ts | 4 +-- .../src/implementation.tsx | 8 +++-- packages/decap-cms-core/src/backend.ts | 29 ++++++++++++++++++- packages/decap-cms-core/src/lib/i18n.ts | 6 +++- .../decap-cms-lib-util/src/implementation.ts | 1 + 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/packages/decap-cms-backend-git-gateway/src/implementation.ts b/packages/decap-cms-backend-git-gateway/src/implementation.ts index 6745bd2dfa2a..b529950af282 100644 --- a/packages/decap-cms-backend-git-gateway/src/implementation.ts +++ b/packages/decap-cms-backend-git-gateway/src/implementation.ts @@ -392,8 +392,8 @@ export default class GitGateway implements Implementation { 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/decap-cms-backend-github/src/implementation.tsx b/packages/decap-cms-backend-github/src/implementation.tsx index 3e61e3f7b022..2d350d2aab2d 100644 --- a/packages/decap-cms-backend-github/src/implementation.tsx +++ b/packages/decap-cms-backend-github/src/implementation.tsx @@ -401,14 +401,18 @@ export default class GitHub implements Implementation { 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/decap-cms-core/src/backend.ts b/packages/decap-cms-core/src/backend.ts index a3a0bf35ba60..61b5c7e3af62 100644 --- a/packages/decap-cms-core/src/backend.ts +++ b/packages/decap-cms-core/src/backend.ts @@ -46,6 +46,7 @@ import { getI18nDataFiles, getI18nBackup, formatI18nBackup, + getI18nInfo, } from './lib/i18n'; import type AssetProxy from './valueObjects/AssetProxy'; @@ -307,6 +308,27 @@ function collectionDepth(collection: Collection) { return depth; } +function collectionRegex(collection: Collection): RegExp | undefined { + console.log('collection', collection.toJS()); + let ruleString = ''; + + if (collection.get('path')) { + ruleString = `${collection.get('folder')}/${collection.get('path')}`.replace( + /{{.*}}/gm, + '(.*)', + ); + } + + if (hasI18n(collection)) { + const { defaultLocale } = getI18nInfo(collection) as { defaultLocale: string }; + ruleString += `\\.${defaultLocale}\\..*`; + } + + console.log('ruleString', ruleString); + + return ruleString ? new RegExp(ruleString) : undefined; +} + export class Backend { implementation: Implementation; backendName: string; @@ -552,7 +574,12 @@ export class Backend { const depth = collectionDepth(collection); const extension = selectFolderEntryExtension(collection); return this.implementation - .allEntriesByFolder(collection.get('folder') as string, extension, depth) + .allEntriesByFolder( + collection.get('folder') as string, + extension, + depth, + collectionRegex(collection), + ) .then(entries => this.processEntries(entries, collection)); } diff --git a/packages/decap-cms-core/src/lib/i18n.ts b/packages/decap-cms-core/src/lib/i18n.ts index 8c30d806a003..013aaf631096 100644 --- a/packages/decap-cms-core/src/lib/i18n.ts +++ b/packages/decap-cms-core/src/lib/i18n.ts @@ -250,7 +250,11 @@ function mergeValues( return entryValue; } -function mergeSingleFileValue(entryValue: EntryValue, defaultLocale: string, locales: string[]) { +function mergeSingleFileValue( + entryValue: EntryValue, + defaultLocale: string, + locales: string[], +): EntryValue { const data = entryValue.data[defaultLocale] || {}; const i18n = locales .filter(l => l !== defaultLocale) diff --git a/packages/decap-cms-lib-util/src/implementation.ts b/packages/decap-cms-lib-util/src/implementation.ts index 45542382e7ac..de055099b77c 100644 --- a/packages/decap-cms-lib-util/src/implementation.ts +++ b/packages/decap-cms-lib-util/src/implementation.ts @@ -177,6 +177,7 @@ export interface Implementation { folder: string, extension: string, depth: number, + pathRegex?: RegExp, ) => Promise; traverseCursor?: ( cursor: Cursor,