UNPKG

file-cms

Version:

File based Content Management System, easy to use with content stored in native file system

115 lines (114 loc) 5.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.listContent = void 0; var tslib_1 = require("tslib"); var path_1 = tslib_1.__importDefault(require("path")); var Config_1 = require("./Config"); var listDirCached_1 = require("./internal/listDirCached"); var fetchContentCached_1 = require("./internal/fetchContentCached"); var attributeFilter_1 = require("./internal/attributeFilter"); var listContent = function (filters, attributes, sort) { if (filters === void 0) { filters = {}; } if (attributes === void 0) { attributes = []; } return tslib_1.__awaiter(void 0, void 0, void 0, function () { var rootDir, typeFilter, slugFilter, contentFilters, filesToFetch, allTypes, typeFilterPredicate, typesToFetch, allContents, contentPredicate, filteredContents, partialContents; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: rootDir = Config_1.Config.getRootDir(); typeFilter = filters.type, slugFilter = filters.slug, contentFilters = tslib_1.__rest(filters, ["type", "slug"]); filesToFetch = []; return [4 /*yield*/, (0, listDirCached_1.listDirCached)(rootDir)]; case 1: allTypes = _a.sent(); typeFilterPredicate = expressionToProvider(typeFilter); typesToFetch = typeFilter ? allTypes.filter(typeFilterPredicate) : allTypes; return [4 /*yield*/, Promise.all(typesToFetch.map(function (type) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var allSlugFileNames, allSlugs, slugFilterPredicate, slugsToFetch, _i, slugsToFetch_1, slug; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, listDirCached_1.listDirCached)(path_1.default.join(rootDir, type))]; case 1: allSlugFileNames = _a.sent(); allSlugs = allSlugFileNames .filter(function (slug) { return slug.endsWith(".md"); }) .map(function (slug) { return slug.substring(0, slug.length - 3); }); slugFilterPredicate = expressionToProvider(slugFilter); slugsToFetch = slugFilter ? allSlugs.filter(slugFilterPredicate) : allSlugs; for (_i = 0, slugsToFetch_1 = slugsToFetch; _i < slugsToFetch_1.length; _i++) { slug = slugsToFetch_1[_i]; filesToFetch.push({ type: type, slug: slug }); } return [2 /*return*/]; } }); }); }))]; case 2: _a.sent(); return [4 /*yield*/, Promise.all(filesToFetch.map(function (_a) { var type = _a.type, slug = _a.slug; return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_b) { return [2 /*return*/, (0, fetchContentCached_1.fetchContentCached)(rootDir, type, slug)]; }); }); }))]; case 3: allContents = _a.sent(); contentPredicate = getContentFilterPredicate(contentFilters); filteredContents = contentPredicate ? allContents.filter(contentPredicate) : allContents; // apply sort if present if (sort) { filteredContents.sort(sort); } partialContents = filteredContents.map(function (content) { return (0, attributeFilter_1.attributeFilter)(content, attributes); }); return [2 /*return*/, partialContents]; } }); }); }; exports.listContent = listContent; var getContentFilterPredicate = function (filters) { var filterKeys = Object.keys(filters); if (filterKeys.length > 0) { var providers_1 = {}; filterKeys.forEach(function (key) { providers_1[key] = expressionToProvider(filters[key]); }); return function (content) { for (var _i = 0, filterKeys_1 = filterKeys; _i < filterKeys_1.length; _i++) { var key = filterKeys_1[_i]; var provider = providers_1[key]; if (!(provider && provider(content[key]))) { return false; } } return true; }; } }; var expressionToProvider = function (expression) { if (expression === undefined) { return; } var fullExpression = expression === null || typeof expression == "string" || typeof expression == "number" || typeof expression == "boolean" ? { eq: expression } : expression; var exprName = Object.keys(fullExpression)[0]; var exprArg = Object.values(fullExpression)[0]; var provider = Config_1.Config.getFilterProvider(exprName); return function (data) { return provider(data, exprArg); }; };