diff --git a/packages/netlify-cms-backend-bitbucket/src/implementation.ts b/packages/netlify-cms-backend-bitbucket/src/implementation.ts index 70770893..ff6970cf 100644 --- a/packages/netlify-cms-backend-bitbucket/src/implementation.ts +++ b/packages/netlify-cms-backend-bitbucket/src/implementation.ts @@ -251,7 +251,7 @@ export default class BitbucketBackend implements Implementation { const listFiles = () => this.api!.listFiles(folder, depth).then(({ entries, cursor: c }) => { - cursor = c; + cursor = c.mergeMeta({ extension }); return filterByPropExtension(extension, 'path')(entries); }); @@ -397,16 +397,21 @@ export default class BitbucketBackend implements Implementation { } traverseCursor(cursor: Cursor, action: string) { - return this.api!.traverseCursor(cursor, action).then( - async ({ entries, cursor: newCursor }) => ({ + return this.api!.traverseCursor(cursor, action).then(async ({ entries, cursor: newCursor }) => { + const extension = cursor.meta?.get('extension'); + if (extension) { + entries = filterByPropExtension(extension as string, 'path')(entries); + newCursor = newCursor.mergeMeta({ extension }); + } + return { entries: await Promise.all( entries.map(file => this.api!.readFile(file.path, file.id).then(data => ({ file, data: data as string })), ), ), cursor: newCursor, - }), - ); + }; + }); } loadMediaFile(branch: string, file: UnpublishedEntryMediaFile) { diff --git a/packages/netlify-cms-backend-gitlab/src/implementation.ts b/packages/netlify-cms-backend-gitlab/src/implementation.ts index c2383507..9a2313b8 100644 --- a/packages/netlify-cms-backend-gitlab/src/implementation.ts +++ b/packages/netlify-cms-backend-gitlab/src/implementation.ts @@ -141,7 +141,7 @@ export default class GitLab implements Implementation { const listFiles = () => this.api!.listFiles(folder, depth > 1).then(({ files, cursor: c }) => { - cursor = c; + cursor = c.mergeMeta({ folder, extension, depth }); return files.filter(file => this.filterFile(folder, file, extension, depth)); }); @@ -245,16 +245,25 @@ export default class GitLab implements Implementation { } traverseCursor(cursor: Cursor, action: string) { - return this.api!.traverseCursor(cursor, action).then( - async ({ entries, cursor: newCursor }) => ({ + return this.api!.traverseCursor(cursor, action).then(async ({ entries, cursor: newCursor }) => { + const [folder, depth, extension] = [ + cursor.meta?.get('folder') as string, + cursor.meta?.get('depth') as number, + cursor.meta?.get('extension') as string, + ]; + if (folder && depth && extension) { + entries = entries.filter(f => this.filterFile(folder, f, extension, depth)); + newCursor = newCursor.mergeMeta({ folder, extension, depth }); + } + return { entries: await Promise.all( entries.map(file => this.api!.readFile(file.path, file.id).then(data => ({ file, data: data as string })), ), ), cursor: newCursor, - }), - ); + }; + }); } loadMediaFile(branch: string, file: UnpublishedEntryMediaFile) { diff --git a/packages/netlify-cms-lib-util/src/Cursor.ts b/packages/netlify-cms-lib-util/src/Cursor.ts index 8736cbe4..43d3baa7 100644 --- a/packages/netlify-cms-lib-util/src/Cursor.ts +++ b/packages/netlify-cms-lib-util/src/Cursor.ts @@ -38,7 +38,16 @@ const jsToMap = (obj: {}) => { return immutableObj; }; -const knownMetaKeys = Set(['index', 'count', 'pageSize', 'pageCount', 'usingOldPaginationAPI']); +const knownMetaKeys = Set([ + 'index', + 'count', + 'pageSize', + 'pageCount', + 'usingOldPaginationAPI', + 'extension', + 'folder', + 'depth', +]); const filterUnknownMetaKeys = (meta: Map) => meta.filter((_v, k) => knownMetaKeys.has(k as string));