Skip to content

Commit 18ef773

Browse files
authored
perf(): filter by path when loading collection from github backend (#6898)
1 parent 7b74b68 commit 18ef773

File tree

5 files changed

+42
-6
lines changed

5 files changed

+42
-6
lines changed

packages/decap-cms-backend-git-gateway/src/implementation.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -392,8 +392,8 @@ export default class GitGateway implements Implementation {
392392
async entriesByFolder(folder: string, extension: string, depth: number) {
393393
return this.backend!.entriesByFolder(folder, extension, depth);
394394
}
395-
allEntriesByFolder(folder: string, extension: string, depth: number) {
396-
return this.backend!.allEntriesByFolder(folder, extension, depth);
395+
allEntriesByFolder(folder: string, extension: string, depth: number, pathRegex?: RegExp) {
396+
return this.backend!.allEntriesByFolder(folder, extension, depth, pathRegex);
397397
}
398398
entriesByFiles(files: ImplementationFile[]) {
399399
return this.backend!.entriesByFiles(files);

packages/decap-cms-backend-github/src/implementation.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -401,14 +401,18 @@ export default class GitHub implements Implementation {
401401
return files;
402402
}
403403

404-
async allEntriesByFolder(folder: string, extension: string, depth: number) {
404+
async allEntriesByFolder(folder: string, extension: string, depth: number, pathRegex?: RegExp) {
405405
const repoURL = this.api!.originRepoURL;
406406

407407
const listFiles = () =>
408408
this.api!.listFiles(folder, {
409409
repoURL,
410410
depth,
411-
}).then(files => files.filter(file => filterByExtension(file, extension)));
411+
}).then(files =>
412+
files.filter(
413+
file => (!pathRegex || pathRegex.test(file.path)) && filterByExtension(file, extension),
414+
),
415+
);
412416

413417
const readFile = (path: string, id: string | null | undefined) => {
414418
return this.api!.readFile(path, id, { repoURL }) as Promise<string>;

packages/decap-cms-core/src/backend.ts

+28-1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import {
4646
getI18nDataFiles,
4747
getI18nBackup,
4848
formatI18nBackup,
49+
getI18nInfo,
4950
} from './lib/i18n';
5051

5152
import type AssetProxy from './valueObjects/AssetProxy';
@@ -307,6 +308,27 @@ function collectionDepth(collection: Collection) {
307308
return depth;
308309
}
309310

311+
function collectionRegex(collection: Collection): RegExp | undefined {
312+
console.log('collection', collection.toJS());
313+
let ruleString = '';
314+
315+
if (collection.get('path')) {
316+
ruleString = `${collection.get('folder')}/${collection.get('path')}`.replace(
317+
/{{.*}}/gm,
318+
'(.*)',
319+
);
320+
}
321+
322+
if (hasI18n(collection)) {
323+
const { defaultLocale } = getI18nInfo(collection) as { defaultLocale: string };
324+
ruleString += `\\.${defaultLocale}\\..*`;
325+
}
326+
327+
console.log('ruleString', ruleString);
328+
329+
return ruleString ? new RegExp(ruleString) : undefined;
330+
}
331+
310332
export class Backend {
311333
implementation: Implementation;
312334
backendName: string;
@@ -552,7 +574,12 @@ export class Backend {
552574
const depth = collectionDepth(collection);
553575
const extension = selectFolderEntryExtension(collection);
554576
return this.implementation
555-
.allEntriesByFolder(collection.get('folder') as string, extension, depth)
577+
.allEntriesByFolder(
578+
collection.get('folder') as string,
579+
extension,
580+
depth,
581+
collectionRegex(collection),
582+
)
556583
.then(entries => this.processEntries(entries, collection));
557584
}
558585

packages/decap-cms-core/src/lib/i18n.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,11 @@ function mergeValues(
250250
return entryValue;
251251
}
252252

253-
function mergeSingleFileValue(entryValue: EntryValue, defaultLocale: string, locales: string[]) {
253+
function mergeSingleFileValue(
254+
entryValue: EntryValue,
255+
defaultLocale: string,
256+
locales: string[],
257+
): EntryValue {
254258
const data = entryValue.data[defaultLocale] || {};
255259
const i18n = locales
256260
.filter(l => l !== defaultLocale)

packages/decap-cms-lib-util/src/implementation.ts

+1
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ export interface Implementation {
177177
folder: string,
178178
extension: string,
179179
depth: number,
180+
pathRegex?: RegExp,
180181
) => Promise<ImplementationEntry[]>;
181182
traverseCursor?: (
182183
cursor: Cursor,

0 commit comments

Comments
 (0)