Fixes #278 filter files by extension
This commit is contained in:
parent
2047fda27c
commit
265146e2d1
@ -18,6 +18,9 @@
|
|||||||
},
|
},
|
||||||
"2015-02-16-this-is-a-toml-frontmatter-post.md": {
|
"2015-02-16-this-is-a-toml-frontmatter-post.md": {
|
||||||
content: "+++\ntitle = \"This is a TOML front matter post\"\nimage = \"/nf-logo.png\"\n\"date\" = \"2015-02-16T00:00:00.000Z\"\n+++\n\n# I Am a Title in Markdown\n\nHello, world\n\n* One Thing\n* Another Thing\n* A Third Thing\n"
|
content: "+++\ntitle = \"This is a TOML front matter post\"\nimage = \"/nf-logo.png\"\n\"date\" = \"2015-02-16T00:00:00.000Z\"\n+++\n\n# I Am a Title in Markdown\n\nHello, world\n\n* One Thing\n* Another Thing\n* A Third Thing\n"
|
||||||
|
},
|
||||||
|
"2015-02-14-this-is-a-post-with-a-different-extension.other": {
|
||||||
|
content: "---\ntitle: This post should not appear because the extension is different\nimage: /nf-logo.png\ndate: 2015-02-14T00:00:00.000Z\n---\n\n# I Am a Title in Markdown\n\nHello, world\n\n* One Thing\n* Another Thing\n* A Third Thing\n"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_faqs: {
|
_faqs: {
|
||||||
|
@ -2,7 +2,7 @@ import TestRepoBackend from "./test-repo/implementation";
|
|||||||
import GitHubBackend from "./github/implementation";
|
import GitHubBackend from "./github/implementation";
|
||||||
import NetlifyAuthBackend from "./netlify-auth/implementation";
|
import NetlifyAuthBackend from "./netlify-auth/implementation";
|
||||||
import { resolveFormat } from "../formats/formats";
|
import { resolveFormat } from "../formats/formats";
|
||||||
import { selectListMethod, selectEntrySlug, selectEntryPath, selectAllowNewEntries } from "../reducers/collections";
|
import { selectListMethod, selectEntrySlug, selectEntryPath, selectAllowNewEntries, selectFolderEntryExtension } from "../reducers/collections";
|
||||||
import { createEntry } from "../valueObjects/Entry";
|
import { createEntry } from "../valueObjects/Entry";
|
||||||
|
|
||||||
class LocalStorageAuthStore {
|
class LocalStorageAuthStore {
|
||||||
@ -82,7 +82,8 @@ class Backend {
|
|||||||
|
|
||||||
listEntries(collection) {
|
listEntries(collection) {
|
||||||
const listMethod = this.implementation[selectListMethod(collection)];
|
const listMethod = this.implementation[selectListMethod(collection)];
|
||||||
return listMethod.call(this.implementation, collection)
|
const extension = selectFolderEntryExtension(collection);
|
||||||
|
return listMethod.call(this.implementation, collection, extension)
|
||||||
.then(loadedEntries => (
|
.then(loadedEntries => (
|
||||||
loadedEntries.map(loadedEntry => createEntry(
|
loadedEntries.map(loadedEntry => createEntry(
|
||||||
collection.get("name"),
|
collection.get("name"),
|
||||||
|
@ -155,7 +155,14 @@ export default class API {
|
|||||||
listFiles(path) {
|
listFiles(path) {
|
||||||
return this.request(`${ this.repoURL }/contents/${ path }`, {
|
return this.request(`${ this.repoURL }/contents/${ path }`, {
|
||||||
params: { ref: this.branch },
|
params: { ref: this.branch },
|
||||||
});
|
})
|
||||||
|
.then(files => {
|
||||||
|
if (!Array.isArray(files)) {
|
||||||
|
throw new Error(`Cannot list files, path ${path} is not a directory but a ${files.type}`);
|
||||||
|
}
|
||||||
|
return files;
|
||||||
|
})
|
||||||
|
.then(files => files.filter(file => file.type === "file"));
|
||||||
}
|
}
|
||||||
|
|
||||||
readUnpublishedBranchFile(contentKey) {
|
readUnpublishedBranchFile(contentKey) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import semaphore from "semaphore";
|
import semaphore from "semaphore";
|
||||||
import AuthenticationPage from "./AuthenticationPage";
|
import AuthenticationPage from "./AuthenticationPage";
|
||||||
import API from "./API";
|
import API from "./API";
|
||||||
|
import { fileExtension } from '../../lib/pathHelper'
|
||||||
|
|
||||||
const MAX_CONCURRENT_DOWNLOADS = 10;
|
const MAX_CONCURRENT_DOWNLOADS = 10;
|
||||||
|
|
||||||
@ -39,8 +40,9 @@ export default class GitHub {
|
|||||||
return Promise.resolve(this.token);
|
return Promise.resolve(this.token);
|
||||||
}
|
}
|
||||||
|
|
||||||
entriesByFolder(collection) {
|
entriesByFolder(collection, extension) {
|
||||||
return this.api.listFiles(collection.get("folder"))
|
return this.api.listFiles(collection.get("folder"))
|
||||||
|
.then(files => files.filter(fileExtension(file.name) === extension))
|
||||||
.then(this.fetchFiles);
|
.then(this.fetchFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import AuthenticationPage from './AuthenticationPage';
|
import AuthenticationPage from './AuthenticationPage';
|
||||||
|
import { fileExtension } from '../../lib/pathHelper'
|
||||||
|
|
||||||
function getFile(path) {
|
function getFile(path) {
|
||||||
const segments = path.split('/');
|
const segments = path.split('/');
|
||||||
@ -40,11 +41,15 @@ export default class TestRepo {
|
|||||||
return Promise.resolve('');
|
return Promise.resolve('');
|
||||||
}
|
}
|
||||||
|
|
||||||
entriesByFolder(collection) {
|
entriesByFolder(collection, extension) {
|
||||||
const entries = [];
|
const entries = [];
|
||||||
const folder = collection.get('folder');
|
const folder = collection.get('folder');
|
||||||
if (folder) {
|
if (folder) {
|
||||||
for (const path in window.repoFiles[folder]) {
|
for (const path in window.repoFiles[folder]) {
|
||||||
|
if (fileExtension(path) !== extension) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const file = { path: `${ folder }/${ path }` };
|
const file = { path: `${ folder }/${ path }` };
|
||||||
entries.push(
|
entries.push(
|
||||||
{
|
{
|
||||||
|
101
src/lib/__tests__/pathHelper.spec.js
Normal file
101
src/lib/__tests__/pathHelper.spec.js
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import { fileExtensionWithSeparator, fileExtension } from '../pathHelper';
|
||||||
|
|
||||||
|
describe('fileExtensionWithSeparator', () => {
|
||||||
|
it('should return the extension of a file', () => {
|
||||||
|
expect(
|
||||||
|
fileExtensionWithSeparator('index.html')
|
||||||
|
).toEqual(
|
||||||
|
'.html'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the extension of a file path', () => {
|
||||||
|
expect(
|
||||||
|
fileExtensionWithSeparator('/src/main/index.html')
|
||||||
|
).toEqual(
|
||||||
|
'.html'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the extension of a file path with trailing slash', () => {
|
||||||
|
expect(
|
||||||
|
fileExtensionWithSeparator('/src/main/index.html/')
|
||||||
|
).toEqual(
|
||||||
|
'.html'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the extension for an extension with two ..', () => {
|
||||||
|
expect(
|
||||||
|
fileExtensionWithSeparator('/src/main/index..html')
|
||||||
|
).toEqual(
|
||||||
|
'.html'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an empty string for the parent path ..', () => {
|
||||||
|
expect(
|
||||||
|
fileExtensionWithSeparator('..')
|
||||||
|
).toEqual(
|
||||||
|
''
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an empty string if the file has no extension', () => {
|
||||||
|
expect(
|
||||||
|
fileExtensionWithSeparator('/src/main/index')
|
||||||
|
).toEqual(
|
||||||
|
''
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('fileExtension', () => {
|
||||||
|
it('should return the extension of a file', () => {
|
||||||
|
expect(
|
||||||
|
fileExtension('index.html')
|
||||||
|
).toEqual(
|
||||||
|
'html'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the extension of a file path', () => {
|
||||||
|
expect(
|
||||||
|
fileExtension('/src/main/index.html')
|
||||||
|
).toEqual(
|
||||||
|
'html'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the extension of a file path with trailing slash', () => {
|
||||||
|
expect(
|
||||||
|
fileExtension('/src/main/index.html/')
|
||||||
|
).toEqual(
|
||||||
|
'html'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the extension for an extension with two ..', () => {
|
||||||
|
expect(
|
||||||
|
fileExtension('/src/main/index..html')
|
||||||
|
).toEqual(
|
||||||
|
'html'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an empty string for the parent path ..', () => {
|
||||||
|
expect(
|
||||||
|
fileExtension('..')
|
||||||
|
).toEqual(
|
||||||
|
''
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an empty string if the file has no extension', () => {
|
||||||
|
expect(
|
||||||
|
fileExtension('/src/main/index')
|
||||||
|
).toEqual(
|
||||||
|
''
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@ -58,11 +58,11 @@ export function basename(p, ext = "") {
|
|||||||
* last portion of the path. If there is no '.' in the last portion of the path
|
* last portion of the path. If there is no '.' in the last portion of the path
|
||||||
* or the first character of it is '.', then it returns an empty string.
|
* or the first character of it is '.', then it returns an empty string.
|
||||||
* @example Usage example
|
* @example Usage example
|
||||||
* path.extname('index.html')
|
* path.fileExtensionWithSeparator('index.html')
|
||||||
* // returns
|
* // returns
|
||||||
* '.html'
|
* '.html'
|
||||||
*/
|
*/
|
||||||
export function extname(p) {
|
export function fileExtensionWithSeparator(p) {
|
||||||
p = normalizePath(p);
|
p = normalizePath(p);
|
||||||
const sections = p.split('/');
|
const sections = p.split('/');
|
||||||
p = sections.pop();
|
p = sections.pop();
|
||||||
@ -79,3 +79,17 @@ export function extname(p) {
|
|||||||
}
|
}
|
||||||
return p.substr(i);
|
return p.substr(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the extension of the path, from after the last '.' to end of string in the
|
||||||
|
* last portion of the path. If there is no '.' in the last portion of the path
|
||||||
|
* or the first character of it is '.', then it returns an empty string.
|
||||||
|
* @example Usage example
|
||||||
|
* path.fileExtension('index.html')
|
||||||
|
* // returns
|
||||||
|
* 'html'
|
||||||
|
*/
|
||||||
|
export function fileExtension(p) {
|
||||||
|
const ext = fileExtensionWithSeparator(p);
|
||||||
|
return ext === '' ? ext : ext.substr(1);
|
||||||
|
}
|
||||||
|
@ -88,6 +88,7 @@ const selectors = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const selectFields = (collection, slug) => selectors[collection.get('type')].fields(collection, slug);
|
export const selectFields = (collection, slug) => selectors[collection.get('type')].fields(collection, slug);
|
||||||
|
export const selectFolderEntryExtension = (collection) => selectors[FOLDER].entryExtension(collection);
|
||||||
export const selectEntryPath = (collection, slug) => selectors[collection.get('type')].entryPath(collection, slug);
|
export const selectEntryPath = (collection, slug) => selectors[collection.get('type')].entryPath(collection, slug);
|
||||||
export const selectEntrySlug = (collection, path) => selectors[collection.get('type')].entrySlug(collection, path);
|
export const selectEntrySlug = (collection, path) => selectors[collection.get('type')].entrySlug(collection, path);
|
||||||
export const selectListMethod = collection => selectors[collection.get('type')].listMethod();
|
export const selectListMethod = collection => selectors[collection.get('type')].listMethod();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user