bloglive-reload.ts8 matches
4const client = new ValTown({ bearerToken: "" });
56async function getProjectAndBranchIds(importMetaUrl: string) {
7// imported dynamically because this is server-only but this file is also imported on the client
8const { parseProject } = await import("https://esm.town/v/std/utils@85-main/index.ts");
23}
2425async function projectLastUpdatedAt({ project_id, branch_id }: { project_id: string; branch_id: string }) {
26const { updatedAt } = await client.vals.branches.retrieve(
27project_id,
34* Creates a wrapper around a fetch handler that injects a script tag into HTML responses
35*
36* @param handler The original fetch handler function
37* @param scriptContent The HTML content to inject
38* @returns A new fetch handler with HTML rewriting capability
39*/
40export function injectHTML(
41handler: (request: Request) => Promise<Response>,
42html: string,
43): (request: Request) => Promise<Response> {
44let HTMLRewriter: typeof import("https://ghuc.cc/worker-tools/html-rewriter/index.ts").HTMLRewriter | undefined;
45// Return the new handler function
46return async (request: Request) => {
47if (!HTMLRewriter) {
69}
7071export function liveReload(
72handler: (request: Request) => Promise<Response>,
73importMetaUrl: string,
99* ------------------------------ */
100101async function registerNextCheck(
102{ pageLoad, project_id, branch_id }: { pageLoad: number; project_id: string; branch_id: string },
103) {
126}
127128export async function main(ids: { project_id: string; branch_id: string }) {
129// don't run this on custom domains, ie not on blog.val.run
130if (!window.location.hostname.endsWith(".val.run")) {
blogLayout.tsx1 match
14}
1516export function Layout({ title, post, children }: LayoutProps) {
17return (
18<html lang="en">
303border-radius: 9999px;
304transition-property: color, background-color;
305transition-timing-function: ease-in-out;
306transition-duration: 200ms;
307}
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
23export function RSSIcon (props: React.SVGProps<SVGSVGElement>) {
4return (
5<svg
24}
2526export function TwitterIcon (props: React.SVGProps<SVGSVGElement>) {
27return (
28<svg
41}
4243export function GitHubIcon (props: React.SVGProps<SVGSVGElement>) {
44return (
45<svg
59}
6061export function BlueskyIcon (props: React.SVGProps<SVGSVGElement>) {
62return (
63<svg
75}
7677export function DiscordIcon (props: React.SVGProps<SVGSVGElement>) {
78return (
79<svg
blogHomePage.tsx1 match
5import Byline from "./Byline.tsx";
67export function HomePage({ posts }: { posts: BlogPost[] }) {
8const latest = posts.at(0);
9const top = posts.slice(1, 3);
7const HLJS_CSS_URL = "https://cdn.jsdelivr.net/npm/highlight.js@11.8.0/styles/base16/solar-flare-light.css";
89export default function Head({ title, post }: {
10title: string;
11post?: BlogPost;
blogget-posts.ts1 match
45// Get all blog posts (local + RSS)
6export async function getAllBlogPosts(): Promise<BlogPost[]> {
7return (await Promise.all([
8getNewPosts(),
blogget-old-posts.ts2 matches
4const OLD_BLOG_RSS = "https://val-town-blog.pages.dev/rss.xml";
5// Get blog posts from RSS feed
6async function getOldPosts(): Promise<BlogPost[]> {
7const parser = new RssParser();
8const feed = await parser.parseURL(OLD_BLOG_RSS);
289"slug": "deprecating-the-run-api",
290"link": "/blog/deprecating-the-run-api",
291"description": "Not every function should be an API",
292"pubDate": "Wed, 07 Feb 2024 00:00:00 GMT",
293"author": "André Terron",
blogget-new-posts.ts2 matches
56// Get all blog posts from the file system
7export async function getNewPosts(): Promise<BlogPost[]> {
8const files = await listFiles(import.meta.url);
9const blogPostFiles = files.filter(
4243// Get a single blog post by slug
44export async function getBlogPostBySlug(slug: string): Promise<BlogPost | null> {
45const post = posts.find(post => post.slug.includes(slug));
46return post;
blogFooter.tsx1 match
5const year = new Date().getFullYear();
67export default function Footer () {
8return (
9<footer className="container">