_includes/fixtures.tsx (840 lines of code) (raw):

import { Tip, TipFrontmatter } from "./resources/tip/TipModels"; import { Author, AuthorFrontmatter } from "./resources/author/AuthorModels"; import { Topic, TopicFrontmatter } from "./resources/topic/TopicModels"; import { vi } from "vitest"; import { EleventyPage, LayoutContext } from "../src/models"; import { Resource, ResourceItem } from "../src/ResourceModels"; import { Tutorial, TutorialFrontmatter, } from "./resources/tutorial/TutorialModels"; import { TutorialStep, TutorialStepFrontmatter, } from "./resources/tutorial/TutorialStepModels"; import { Playlist, PlaylistFrontmatter, } from "./resources/playlist/PlaylistModels"; import { PaginationProps } from "./pagination/Pagination.11ty"; import { Article, ArticleFrontmatter } from "./resources/article/ArticleModels"; import { Channel, ChannelFrontmatter } from "./resources/channel/ChannelModels"; import { makeResourceMap, makeResources, resolveResourceMap, } from "../src/registration"; import { resourceClasses } from "./config"; import { Link, LinkFrontmatter } from "./resources/link/LinkModels"; /** * Reusable test data */ const content = `<p>Hello <em id="world">world</em>.</p>`; const date = new Date(Date.UTC(2023, 1, 11)); const laterDate = new Date(Date.UTC(2023, 1, 22)); const children: string[] = []; const tipFrontmatters: TipFrontmatter[] = [ { title: "Some Tip", date, resourceType: "tip", author: "sa", topics: ["sto", "ato", "sp", "ap", "ste", "ate"], thumbnail: "thumbnail.png", obsoletes: ["/oldtips/tip1/", "/oldtips/tip2/"], channel: "/channels/some-channel/", }, { title: "Another Tip", date: laterDate, resourceType: "tip", author: "aa", tags: ["tag1", "tag2"], topics: ["sto", "ato", "ste", "ate"], thumbnail: "aa.png", }, ]; // This is data shaped like the collection API sends it: data/page/content. const tipItems: { content: string; data: TipFrontmatter; page: EleventyPage; }[] = [ { content, data: { ...tipFrontmatters[0] }, page: { fileSlug: "some-tip", url: "/tips/some-tip/", inputPath: `/tips/some-tip/index.md`, date, rawInput: "", }, }, { content, data: { ...tipFrontmatters[1] }, page: { fileSlug: "another-tip", url: "/tips/another-tip/", inputPath: `/tips/another-tip/index.md`, date, rawInput: "", }, }, ]; // This is data shaped like on our side. const tipDatas: { data: TipFrontmatter; page: EleventyPage; content: string; }[] = [ { content, data: { ...tipItems[0].data }, page: tipItems[0].page, }, { content, data: { ...tipItems[1].data }, page: tipItems[1].page, }, ]; const tips = tipDatas.map( (ref) => new Tip({ data: ref.data, page: ref.page, }), ); const linkFrontmatters: LinkFrontmatter[] = [ { title: "Some Link", date, resourceType: "link", author: "sa", topics: ["sto", "ato", "sp", "ap", "ste", "ate"], thumbnail: "thumbnail.png", linkURL: "http://some.jetbrains.link", }, { title: "Another Link", date: laterDate, resourceType: "link", author: "aa", topics: ["sto", "ato", "ste", "ate"], thumbnail: "aa.png", linkURL: "http://another.jetbrains.link", }, ]; const linkItems: { content: string; data: LinkFrontmatter; page: EleventyPage; }[] = [ { content, data: { ...linkFrontmatters[0] }, page: { fileSlug: "some-link", url: "/links/some-link/", inputPath: `/links/some-link/index.md`, date, rawInput: "", }, }, { content, data: { ...linkFrontmatters[1] }, page: { fileSlug: "another-link", url: "/links/another-link/", inputPath: `/links/another-link/index.md`, date, rawInput: "", }, }, ]; const linkDatas: { data: LinkFrontmatter; page: EleventyPage; content: string; }[] = [ { content, data: { ...linkItems[0].data }, page: linkItems[0].page, }, { content, data: { ...linkItems[1].data }, page: linkItems[1].page, }, ]; const links = await Promise.all( linkDatas.map( async (ref) => await new Link({ data: ref.data, page: ref.page, }), ), ); const channelFrontmatters: ChannelFrontmatter[] = [ { title: "Some Channel", date, resourceType: "channel", author: "sa", logo: "thumbnail.png", subnav: [{ title: "First Link", url: "/first/" }], }, { title: "Another Channel", date: laterDate, resourceType: "channel", author: "aa", logo: "aa.png", }, ]; const channelItems: { content: string; data: ChannelFrontmatter; page: EleventyPage; }[] = [ { content, data: { ...channelFrontmatters[0] }, page: { fileSlug: "some-channel", url: "/channels/some-channel/", inputPath: `/channels/some-channel/index.md`, date, rawInput: "", }, }, { content, data: { ...channelFrontmatters[1] }, page: { fileSlug: "another-channel", url: "/channels/another-channel/", inputPath: `/channels/another-channel/index.md`, date, rawInput: "", }, }, ]; const channelDatas: { data: ChannelFrontmatter; page: EleventyPage; content: string; }[] = [ { content, data: { ...channelItems[0].data }, page: channelItems[0].page, }, { content, data: { ...channelItems[1].data }, page: channelItems[1].page, }, ]; const channels = channelDatas.map( (ref) => new Channel({ data: ref.data, page: ref.page, }), ); const articleItems: { content: string; data: ArticleFrontmatter; page: EleventyPage; }[] = [ { content, data: { ...tipFrontmatters[0] }, page: { fileSlug: "some-article", url: "/articles/some-article/", inputPath: `/articles/some-article/index.md`, date, rawInput: "", }, }, ]; const articleDatas: { data: TipFrontmatter; page: EleventyPage; content: string; }[] = [ { content, data: { ...articleItems[0].data }, page: articleItems[0].page, }, ]; const authorsFrontmatters: AuthorFrontmatter[] = [ { date: date, author: "sa", title: "Some Author", resourceType: "author", label: "sa", thumbnail: "sa.png", }, { date: date, author: "sa", title: "Another Author", resourceType: "author", label: "aa", thumbnail: "aa.png", }, ]; // This is data shaped like the collection API sends it: data/page/content. const authorItems: { content: string; data: AuthorFrontmatter; page: EleventyPage; }[] = [ { content, data: { ...authorsFrontmatters[0] }, page: { fileSlug: "sa", url: "/authors/sa/", inputPath: `/authors/sa/index.md`, date, rawInput: "", }, }, { content, data: { ...authorsFrontmatters[1] }, page: { fileSlug: "aa", url: "/authors/aa/", inputPath: "./site/webstorm-pycharm-webstorm-guide/authors/aa/index.md", date, rawInput: "", }, }, ]; // This is data shaped like on our side. const authorDatas: { data: AuthorFrontmatter; page: EleventyPage; content: string; }[] = [ { content, data: { ...authorItems[0].data }, page: authorItems[0].page, }, { content, data: { ...authorItems[1].data }, page: authorItems[1].page, }, ]; const topicFrontmatters: TopicFrontmatter[] = [ { date: date, author: "sa", title: "Some Topic", resourceType: "topic", label: "sto", accent: "st-accent", icon: "st-icon.png", }, { date: date, author: "sa", title: "Another Topic", resourceType: "topic", label: "ato", accent: "at-accent", icon: "at-icon.png", }, { date: date, author: "sa", title: "Some Technology", resourceType: "topic", label: "ste", logo: "stlogo.svg", }, { date: date, author: "sa", title: "Another Technology", resourceType: "topic", label: "ate", logo: "atlogo.svg", }, { date: date, author: "sa", title: "Some Product", resourceType: "topic", label: "sp", logo: "some.png", }, { date: date, author: "sa", title: "Another Product", resourceType: "topic", label: "ap", logo: "another.png", }, ]; // This is data shaped like the collection API sends it: data/page/content. const topicItems: { content: string; data: TopicFrontmatter; page: EleventyPage; }[] = [ { content, data: { ...topicFrontmatters[0] }, page: { fileSlug: "ato", url: "/topics/ato/", inputPath: `/topics/ato/index.md`, date, rawInput: "", }, }, { content, data: { ...topicFrontmatters[1] }, page: { fileSlug: "sto", url: "/topics/sto/", inputPath: `/products/sto/index.md`, date, rawInput: "", }, }, { content, data: { ...topicFrontmatters[2] }, page: { fileSlug: "ste", url: "/topics/ste/", inputPath: `/topics/ste/index.md`, date, rawInput: "", }, }, { content, data: { ...topicFrontmatters[3] }, page: { fileSlug: "ate", url: "/topics/ate/", inputPath: `/topics/ate/index.md`, date, rawInput: "", }, }, { content, data: { ...topicFrontmatters[4] }, page: { fileSlug: "sp", url: "/topics/sp/", inputPath: `/topics/sp/index.md`, date, rawInput: "", }, }, { content, data: { ...topicFrontmatters[5] }, page: { fileSlug: "ap", url: "/topics/ap/", inputPath: `/topics/ap/index.md`, date, rawInput: "", }, }, ]; // This is data shaped like on our side. const topicDatas: { data: TopicFrontmatter; page: EleventyPage; content: string; }[] = [ { content, data: { ...topicItems[0].data }, page: topicItems[0].page, }, { content, data: { ...topicItems[1].data }, page: topicItems[1].page, }, { content, data: { ...topicItems[2].data }, page: topicItems[2].page, }, { content, data: { ...topicItems[3].data }, page: topicItems[3].page, }, { content, data: { ...topicItems[4].data }, page: topicItems[4].page, }, { content, data: { ...topicItems[5].data }, page: topicItems[5].page, }, ]; export const tutorialFrontmatters: TutorialFrontmatter[] = [ { title: "Some Tutorial", resourceType: "tutorial", author: "sa", date, thumbnail: "thumbnail.png", tutorialItems: [ "./some-tutorialstep", "./another-tutorialstep", "./third-tutorialstep", ], }, { title: "Another Tutorial", resourceType: "tutorial", author: "sa", date: laterDate, thumbnail: "thumbnail.png", tutorialItems: [], }, ]; export const tutorialItems: { content: string; data: TutorialFrontmatter; page: EleventyPage; }[] = [ { content, data: { ...tutorialFrontmatters[0] }, page: { fileSlug: "some-tutorial", url: "/tutorials/some-tutorial/", inputPath: `/tutorials/some-tutorial/index.md`, date, rawInput: "", }, }, { content, data: { ...tutorialFrontmatters[1] }, page: { fileSlug: "another-tutorial", url: "/tutorials/another-tutorial/", inputPath: `/tutorials/another-tutorial/index.md`, date, rawInput: "", }, }, ]; export const tutorialDatas: { data: TutorialFrontmatter; page: EleventyPage; content: string; }[] = [ { content, data: { ...tutorialItems[0].data }, page: tutorialItems[0].page, }, { content, data: { ...tutorialItems[1].data }, page: tutorialItems[1].page, }, ]; export const tutorialStepFrontmatters: TutorialStepFrontmatter[] = [ { title: "Some Tutorial Step", resourceType: "tutorialstep", author: "sa", date, thumbnail: "thumbnail.png", }, { title: "Another Tutorial Step", resourceType: "tutorialstep", author: "sa", thumbnail: "thumbnail.png", date, }, { title: "Third Tutorial Step", resourceType: "tutorialstep", author: "sa", date, thumbnail: "thumbnail.png", }, ]; export const tutorialStepItems: { content: string; data: TutorialStepFrontmatter; page: EleventyPage; }[] = [ { content, data: { ...tutorialStepFrontmatters[0] }, page: { fileSlug: "some-tutorialstep", url: "/tutorials/some-tutorial/some-tutorialstep/", inputPath: `/tutorials/some-tutorial/some-tutorialstep/index.md`, date, rawInput: "", }, }, { content, data: { ...tutorialStepFrontmatters[1] }, page: { fileSlug: "another-tutorialstep", url: "/tutorials/some-tutorial/another-tutorialstep/", inputPath: `/tutorials/some-tutorial/another-tutorialstep/index.md`, date, rawInput: "", }, }, { content, data: { ...tutorialStepFrontmatters[2] }, page: { fileSlug: "third-tutorialstep", url: "/tutorials/some-tutorial/third-tutorialstep/", inputPath: `/tutorials/some-tutorial/third-tutorialstep/index.md`, date, rawInput: "", }, }, ]; export const tutorialStepDatas: { data: TutorialStepFrontmatter; page: EleventyPage; content: string; }[] = [ { content, data: { ...tutorialStepItems[0].data, }, page: tutorialStepItems[0].page, }, { content, data: { ...tutorialStepItems[1].data, }, page: tutorialStepItems[1].page, }, { content, data: { ...tutorialStepItems[2].data, }, page: tutorialStepItems[2].page, }, ]; export const playlistFrontmatters: PlaylistFrontmatter[] = [ { title: "Some Playlist", resourceType: "playlist", author: "sa", date, thumbnail: "thumbnail.png", playlistItems: ["/tips/some-tip/"], }, { title: "Another Playlist", resourceType: "playlist", author: "sa", thumbnail: "thumbnail.png", date, playlistItems: [], }, ]; export const playlistItems: { content: string; data: PlaylistFrontmatter; page: EleventyPage; }[] = [ { content, data: { ...playlistFrontmatters[0] }, page: { fileSlug: "some-playlist", url: "/playlists/some-playlist/", inputPath: `/playlists/some-playlist/index.md`, date, rawInput: "", }, }, { content, data: { ...playlistFrontmatters[1] }, page: { fileSlug: "another-playlist", url: "/playlists/another-playlist/", inputPath: `/playlists/another-playlist/index.md`, date, rawInput: "", }, }, ]; export const playlistDatas: { data: PlaylistFrontmatter; page: EleventyPage; content: string; }[] = [ { content, data: { ...playlistItems[0].data }, page: playlistItems[0].page, }, { content, data: { ...playlistItems[1].data }, page: playlistItems[1].page, }, ]; // This data structure matches collections.all // https://www.11ty.dev/docs/collections/#collection-item-data-structure const all: ResourceItem[] = [ ...tipItems, ...tutorialItems, ...tutorialStepItems, ...authorItems, ...topicItems, ...playlistItems, ...articleItems, ...channelItems, ...linkItems, ]; const authors = authorDatas.map( (ref) => new Author({ data: ref.data, page: ref.page, }), ); const topics = topicDatas.map( (ref) => new Topic({ data: ref.data, page: ref.page, }), ); const articles = articleDatas.map( (ref) => new Article({ data: ref.data, page: ref.page, }), ); const tutorials = tutorialDatas.map( (ref) => new Tutorial({ data: ref.data, page: ref.page, }), ); const tutorialSteps = tutorialStepDatas.map( (ref) => new TutorialStep({ data: ref.data, page: ref.page, }), ); const playlists = playlistDatas.map( (ref) => new Playlist({ data: ref.data, page: ref.page, }), ); const allResources = new Map<string, Resource>(); [ ...tips, ...tutorials, ...tutorialSteps, ...playlists, ...channels, ...links, ].forEach((resource) => allResources.set(resource.url, resource)); const resources = makeResources({ collectionItems: all, resourceClasses, }); const resourceMap = makeResourceMap(resources); resolveResourceMap(resourceMap); const getResource = vi.fn(); const renderMarkdown = (content: string): string => content; const context: LayoutContext = { getResources: () => resources as any, getResource, renderMarkdown, }; export const commandLineArgs = { pathprefix: undefined }; export const baseRenderData = { author: "sa", date, collections: { all, resourceMap, }, commandLineArgs, content: "", }; const paginationItems = [...tipItems, ...articleItems] as const; const paginationProps: PaginationProps = { pagination: { items: [...paginationItems], pageNumber: 0, hrefs: paginationItems.map((ti) => ti.page.url), href: { next: "tip5", previous: "tip3", first: "tip0", last: "tip6", }, }, }; // Now assemble for export const fixtures = { articles, authors, authorItems, children, // collections, content, date, paginationProps, channels, channelItems, tips, tipItems, links, linkItems, topics, topicItems, tutorials, tutorialItems, tutorialSteps, tutorialStepItems, playlists, playlistItems, all, context, resources, resourceMap, }; export default fixtures;