Files
morten-olsen.github.io/bin/build/index.ts
Morten Olsen 9b1a067d56 init
2023-03-27 10:46:18 +02:00

117 lines
3.0 KiB
TypeScript

import { resolve } from "path";
import { createReact } from "../resources/react";
import { Observable, getCollectionItems } from "../observable";
import { createPage } from "../resources/page";
import { createArticles } from "../data/articles";
import { Bundler } from "../bundler";
import { forEach } from "../utils/observable";
import { createEjs } from "../resources/ejs";
import { createLatex } from "../resources/latex";
import { markdownToLatex } from "../utils/markdown";
import { createPositions } from "../data/positions";
import { createProfile } from "../data/profile";
import { Position } from "../../types";
const build = async () => {
const bundler = new Bundler();
const articles = createArticles({
bundler,
});
const positions = createPositions({
bundler,
});
const profile = createProfile({
bundler,
});
const latex = {
article: createEjs(resolve("content/templates/latex/article.tex")),
resume: createEjs(resolve("content/templates/latex/resume.tex")),
};
const react = {
article: createReact(resolve("content/templates/react/article.tsx")),
frontpage: createReact(resolve("content/templates/react/frontpage.tsx")),
};
const resumeProps = Observable.combine({
articles: articles.pipe(getCollectionItems),
positions: positions.pipe(async (positions) => {
const result: Position[] = [];
for (const a of positions) {
const item = await a.data;
const content = markdownToLatex({
root: resolve("content"),
content: item.raw,
});
result.push({
...item,
content,
});
}
return result;
}),
profile,
});
const resumeUrl = createLatex({
bundler,
path: "/resume",
data: resumeProps,
template: latex.resume,
});
{
const props = Observable.combine({
articles: articles.pipe(getCollectionItems),
positions: positions.pipe(getCollectionItems),
profile,
resumeUrl: new Observable(async () => resumeUrl),
});
createPage({
path: "/",
props,
template: react.frontpage,
bundler,
});
}
await forEach(articles, async (article) => {
const { slug } = await article.data;
const pdfUrl = createLatex({
bundler,
path: resolve("/articles", slug),
template: latex.article,
data: Observable.combine({
article: article.pipe(async ({ title, cover, root, raw }) => {
const body = markdownToLatex({
root,
content: raw,
});
return {
title,
body,
cover: resolve(root, cover),
};
}),
}),
});
const props = Observable.combine({
article,
profile,
pdfUrl: new Observable(async () => pdfUrl),
resumeUrl: new Observable(async () => resumeUrl),
});
createPage({
path: `/articles/${slug}`,
props,
template: react.article,
bundler,
});
});
return bundler;
};
export { build };