UNPKG

gatsby-theme-advanced

Version:
97 lines (96 loc) 4.63 kB
"use strict"; /* eslint "no-console": "off" */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createFeed = exports.createPageMeta = exports.initFeedMeta = exports.getFeedRoute = exports.saveFeedPageMeta = void 0; const path_1 = __importDefault(require("path")); const fs_1 = __importDefault(require("fs")); const config_1 = require("../../src/config"); const FEED_META_DIR = `public/${config_1.constants.feedMetaDirectory}`; const POSTS_PER_PAGE = config_1.constants.postsPerFeedPage; const FEED_COMPONENT = require.resolve("../../src/templates/feed/index.jsx"); // Save feed page metadata in the public folder for later retrieval by the client side code const saveFeedPageMeta = (feedType, feedPageIndex, pageMeta, feedId) => __awaiter(void 0, void 0, void 0, function* () { const filePath = path_1.default.join(FEED_META_DIR, `${feedType}${feedId ? `-${feedId}` : ""}-${feedPageIndex}.json`); const stringifiedListing = JSON.stringify(pageMeta); yield fs_1.default.promises.writeFile(filePath, stringifiedListing); }); exports.saveFeedPageMeta = saveFeedPageMeta; // Calculate feed path const getFeedRoute = (config, feedType, feedId) => { const slug = feedType === "index" ? "/" : `/${feedType}${feedId ? `/${feedId}` : ""}`; // Add basePath return (0, config_1.withBasePath)(config, slug); }; exports.getFeedRoute = getFeedRoute; // Cleans up and sets up the feed meta folder const initFeedMeta = () => { if (!fs_1.default.existsSync(FEED_META_DIR)) { fs_1.default.mkdirSync(FEED_META_DIR); } else { fs_1.default.rmSync(FEED_META_DIR, { recursive: true }); fs_1.default.mkdirSync(FEED_META_DIR); } }; exports.initFeedMeta = initFeedMeta; // Calculate the metadata for a feed page const createPageMeta = (pageIndex, pageCount, feedPosts) => { const limit = POSTS_PER_PAGE; const skip = pageIndex * POSTS_PER_PAGE; const feedPagePosts = feedPosts.slice(skip, skip + limit); // Compute and save a feed page metadata file const nextPage = pageIndex + 1 < pageCount ? pageIndex + 1 : undefined; const prevPage = pageIndex > 0 ? pageIndex - 1 : undefined; // Calculate the amount of pages in the next batch const postsLeft = feedPosts.length - skip - limit; const nextCount = postsLeft > 0 ? Math.min(postsLeft, limit) : undefined; const prevCount = typeof prevPage === "number" ? limit : undefined; return { current: pageIndex, next: nextPage, nextCount, prev: prevPage, prevCount, posts: feedPagePosts, }; }; exports.createPageMeta = createPageMeta; // Creates a paginated feed with Gatsby pages and feed metadata const createFeed = (config, actions, feedPosts, feedType, feedId) => __awaiter(void 0, void 0, void 0, function* () { // Calculate the page count const pageCount = Math.ceil(feedPosts.length / POSTS_PER_PAGE); // For each page const tasks = [...Array(pageCount).keys()].map((pageIndex) => __awaiter(void 0, void 0, void 0, function* () { const pageMeta = (0, exports.createPageMeta)(pageIndex, pageCount, feedPosts); yield (0, exports.saveFeedPageMeta)(feedType, pageIndex, pageMeta, feedId); // Create an index page that resides on `${feedId}/` if (pageIndex === 0) { const route = (0, exports.getFeedRoute)(config, feedType, feedId); actions.createPage({ path: route, component: FEED_COMPONENT, context: { pageCount, pageIndex, feedType, feedId, feedPageMeta: pageMeta, }, }); } })); yield Promise.all(tasks); }); exports.createFeed = createFeed;