From 09d6595750aa1f732909003a4510db62f3a9137a Mon Sep 17 00:00:00 2001 From: Brian Bornino Date: Sat, 4 Jul 2026 08:15:51 -0700 Subject: [PATCH 1/4] feat(api): add GET /content/schema/{post,collection,author} endpoints Exposes the sync worker's TypeBox frontmatter schemas directly so downstream consumers have a single source of truth for valid post, collection, and author frontmatter shape. --- apps/api/src/createApp.ts | 6 +++ .../src/routes/content/schema-author.test.ts | 27 ++++++++++++ apps/api/src/routes/content/schema-author.ts | 40 ++++++++++++++++++ .../routes/content/schema-collection.test.ts | 27 ++++++++++++ .../src/routes/content/schema-collection.ts | 41 +++++++++++++++++++ .../src/routes/content/schema-post.test.ts | 27 ++++++++++++ apps/api/src/routes/content/schema-post.ts | 40 ++++++++++++++++++ 7 files changed, 208 insertions(+) create mode 100644 apps/api/src/routes/content/schema-author.test.ts create mode 100644 apps/api/src/routes/content/schema-author.ts create mode 100644 apps/api/src/routes/content/schema-collection.test.ts create mode 100644 apps/api/src/routes/content/schema-collection.ts create mode 100644 apps/api/src/routes/content/schema-post.test.ts create mode 100644 apps/api/src/routes/content/schema-post.ts diff --git a/apps/api/src/createApp.ts b/apps/api/src/createApp.ts index 0f4dae64..83ddf7a3 100644 --- a/apps/api/src/createApp.ts +++ b/apps/api/src/createApp.ts @@ -9,6 +9,9 @@ import authorsRoutes from "./routes/content/authors.ts"; import collectionsRoutes from "./routes/content/collections.ts"; import postRoutes from "./routes/content/post.ts"; import profilesRoutes from "./routes/content/profiles.ts"; +import schemaPostRoutes from "./routes/content/schema-post.ts"; +import schemaCollectionRoutes from "./routes/content/schema-collection.ts"; +import schemaAuthorRoutes from "./routes/content/schema-author.ts"; import fastify from "fastify"; import devRoutes from "./routes/dev/index.ts"; @@ -27,6 +30,9 @@ export const createApp = () => { app.register(collectionsRoutes); app.register(postRoutes); app.register(profilesRoutes); + app.register(schemaPostRoutes); + app.register(schemaCollectionRoutes); + app.register(schemaAuthorRoutes); if (env.ENVIRONMENT === "development") { app.register(devRoutes); diff --git a/apps/api/src/routes/content/schema-author.test.ts b/apps/api/src/routes/content/schema-author.test.ts new file mode 100644 index 00000000..5a55bb8d --- /dev/null +++ b/apps/api/src/routes/content/schema-author.test.ts @@ -0,0 +1,27 @@ +import fastify, { type FastifyInstance } from "fastify"; +import schemaAuthorRoutes from "./schema-author.ts"; +import { AuthorMetaSchema } from "../../../../worker/src/tasks/sync-author/types.ts"; + +describe("Schema Author Routes Tests", () => { + let app: FastifyInstance; + beforeAll(async () => { + app = fastify(); + await app.register(schemaAuthorRoutes); + }); + + afterAll(async () => { + await app.close(); + }); + + describe("/content/schema/author", () => { + test("returns the author frontmatter JSON Schema", async () => { + const response = await app.inject({ + method: "GET", + url: "/content/schema/author", + }); + + expect(response.statusCode).toBe(200); + expect(response.json()).toEqual(AuthorMetaSchema); + }); + }); +}); diff --git a/apps/api/src/routes/content/schema-author.ts b/apps/api/src/routes/content/schema-author.ts new file mode 100644 index 00000000..1986d18e --- /dev/null +++ b/apps/api/src/routes/content/schema-author.ts @@ -0,0 +1,40 @@ +import type { FastifyPluginAsync } from "fastify"; +import { Type } from "typebox"; +import { AuthorMetaSchema } from "../../../../worker/src/tasks/sync-author/types.ts"; + +const SchemaAuthorResponseSchema = Type.Object( + {}, + { + additionalProperties: true, + description: "A JSON Schema document describing valid author frontmatter.", + examples: [AuthorMetaSchema], + }, +); + +const schemaAuthorRoutes: FastifyPluginAsync = async (fastify) => { + fastify.get( + "/content/schema/author", + { + schema: { + description: + "Fetch the JSON Schema for author frontmatter, as validated by the sync worker.", + response: { + 200: { + description: "Successful", + content: { + "application/json": { + schema: SchemaAuthorResponseSchema, + }, + }, + }, + }, + }, + }, + async (_request, reply) => { + reply.code(200); + reply.send(AuthorMetaSchema); + }, + ); +}; + +export default schemaAuthorRoutes; diff --git a/apps/api/src/routes/content/schema-collection.test.ts b/apps/api/src/routes/content/schema-collection.test.ts new file mode 100644 index 00000000..477cb69a --- /dev/null +++ b/apps/api/src/routes/content/schema-collection.test.ts @@ -0,0 +1,27 @@ +import fastify, { type FastifyInstance } from "fastify"; +import schemaCollectionRoutes from "./schema-collection.ts"; +import { CollectionMetaSchema } from "../../../../worker/src/tasks/sync-collection/types.ts"; + +describe("Schema Collection Routes Tests", () => { + let app: FastifyInstance; + beforeAll(async () => { + app = fastify(); + await app.register(schemaCollectionRoutes); + }); + + afterAll(async () => { + await app.close(); + }); + + describe("/content/schema/collection", () => { + test("returns the collection frontmatter JSON Schema", async () => { + const response = await app.inject({ + method: "GET", + url: "/content/schema/collection", + }); + + expect(response.statusCode).toBe(200); + expect(response.json()).toEqual(CollectionMetaSchema); + }); + }); +}); diff --git a/apps/api/src/routes/content/schema-collection.ts b/apps/api/src/routes/content/schema-collection.ts new file mode 100644 index 00000000..86db0d0e --- /dev/null +++ b/apps/api/src/routes/content/schema-collection.ts @@ -0,0 +1,41 @@ +import type { FastifyPluginAsync } from "fastify"; +import { Type } from "typebox"; +import { CollectionMetaSchema } from "../../../../worker/src/tasks/sync-collection/types.ts"; + +const SchemaCollectionResponseSchema = Type.Object( + {}, + { + additionalProperties: true, + description: + "A JSON Schema document describing valid collection frontmatter.", + examples: [CollectionMetaSchema], + }, +); + +const schemaCollectionRoutes: FastifyPluginAsync = async (fastify) => { + fastify.get( + "/content/schema/collection", + { + schema: { + description: + "Fetch the JSON Schema for collection frontmatter, as validated by the sync worker.", + response: { + 200: { + description: "Successful", + content: { + "application/json": { + schema: SchemaCollectionResponseSchema, + }, + }, + }, + }, + }, + }, + async (_request, reply) => { + reply.code(200); + reply.send(CollectionMetaSchema); + }, + ); +}; + +export default schemaCollectionRoutes; diff --git a/apps/api/src/routes/content/schema-post.test.ts b/apps/api/src/routes/content/schema-post.test.ts new file mode 100644 index 00000000..092171e2 --- /dev/null +++ b/apps/api/src/routes/content/schema-post.test.ts @@ -0,0 +1,27 @@ +import fastify, { type FastifyInstance } from "fastify"; +import schemaPostRoutes from "./schema-post.ts"; +import { PostMetaSchema } from "../../../../worker/src/tasks/sync-post/types.ts"; + +describe("Schema Post Routes Tests", () => { + let app: FastifyInstance; + beforeAll(async () => { + app = fastify(); + await app.register(schemaPostRoutes); + }); + + afterAll(async () => { + await app.close(); + }); + + describe("/content/schema/post", () => { + test("returns the post frontmatter JSON Schema", async () => { + const response = await app.inject({ + method: "GET", + url: "/content/schema/post", + }); + + expect(response.statusCode).toBe(200); + expect(response.json()).toEqual(PostMetaSchema); + }); + }); +}); diff --git a/apps/api/src/routes/content/schema-post.ts b/apps/api/src/routes/content/schema-post.ts new file mode 100644 index 00000000..1fe87850 --- /dev/null +++ b/apps/api/src/routes/content/schema-post.ts @@ -0,0 +1,40 @@ +import type { FastifyPluginAsync } from "fastify"; +import { Type } from "typebox"; +import { PostMetaSchema } from "../../../../worker/src/tasks/sync-post/types.ts"; + +const SchemaPostResponseSchema = Type.Object( + {}, + { + additionalProperties: true, + description: "A JSON Schema document describing valid post frontmatter.", + examples: [PostMetaSchema], + }, +); + +const schemaPostRoutes: FastifyPluginAsync = async (fastify) => { + fastify.get( + "/content/schema/post", + { + schema: { + description: + "Fetch the JSON Schema for post frontmatter, as validated by the sync worker.", + response: { + 200: { + description: "Successful", + content: { + "application/json": { + schema: SchemaPostResponseSchema, + }, + }, + }, + }, + }, + }, + async (_request, reply) => { + reply.code(200); + reply.send(PostMetaSchema); + }, + ); +}; + +export default schemaPostRoutes; From afc39a51ee5fecafecd7bbbc12a22ef22fb2a4f5 Mon Sep 17 00:00:00 2001 From: Brian Bornino Date: Sat, 4 Jul 2026 13:00:43 -0700 Subject: [PATCH 2/4] refactor(api): extract createSchemaRoute factory for schema endpoints Addresses CodeRabbit's suggestion on PR #180 to de-duplicate the identical route/response-wrapper boilerplate across schema-post.ts, schema-collection.ts, and schema-author.ts. --- .../src/routes/content/createSchemaRoute.ts | 42 +++++++++++++++++++ apps/api/src/routes/content/schema-author.ts | 40 +++--------------- .../src/routes/content/schema-collection.ts | 41 +++--------------- apps/api/src/routes/content/schema-post.ts | 40 +++--------------- 4 files changed, 57 insertions(+), 106 deletions(-) create mode 100644 apps/api/src/routes/content/createSchemaRoute.ts diff --git a/apps/api/src/routes/content/createSchemaRoute.ts b/apps/api/src/routes/content/createSchemaRoute.ts new file mode 100644 index 00000000..e923e0c5 --- /dev/null +++ b/apps/api/src/routes/content/createSchemaRoute.ts @@ -0,0 +1,42 @@ +import type { FastifyPluginAsync } from "fastify"; +import { Type, type TSchema } from "typebox"; + +export const createSchemaRoute = ( + path: string, + description: string, + schema: TSchema, +): FastifyPluginAsync => { + const responseSchema = Type.Object( + {}, + { + additionalProperties: true, + description, + examples: [schema], + }, + ); + + return async (fastify) => { + fastify.get( + path, + { + schema: { + description, + response: { + 200: { + description: "Successful", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + }, + }, + }, + async (_request, reply) => { + reply.code(200); + reply.send(schema); + }, + ); + }; +}; diff --git a/apps/api/src/routes/content/schema-author.ts b/apps/api/src/routes/content/schema-author.ts index 1986d18e..3e531b29 100644 --- a/apps/api/src/routes/content/schema-author.ts +++ b/apps/api/src/routes/content/schema-author.ts @@ -1,40 +1,10 @@ -import type { FastifyPluginAsync } from "fastify"; -import { Type } from "typebox"; import { AuthorMetaSchema } from "../../../../worker/src/tasks/sync-author/types.ts"; +import { createSchemaRoute } from "./createSchemaRoute.ts"; -const SchemaAuthorResponseSchema = Type.Object( - {}, - { - additionalProperties: true, - description: "A JSON Schema document describing valid author frontmatter.", - examples: [AuthorMetaSchema], - }, +const schemaAuthorRoutes = createSchemaRoute( + "/content/schema/author", + "Fetch the JSON Schema for author frontmatter, as validated by the sync worker.", + AuthorMetaSchema, ); -const schemaAuthorRoutes: FastifyPluginAsync = async (fastify) => { - fastify.get( - "/content/schema/author", - { - schema: { - description: - "Fetch the JSON Schema for author frontmatter, as validated by the sync worker.", - response: { - 200: { - description: "Successful", - content: { - "application/json": { - schema: SchemaAuthorResponseSchema, - }, - }, - }, - }, - }, - }, - async (_request, reply) => { - reply.code(200); - reply.send(AuthorMetaSchema); - }, - ); -}; - export default schemaAuthorRoutes; diff --git a/apps/api/src/routes/content/schema-collection.ts b/apps/api/src/routes/content/schema-collection.ts index 86db0d0e..74f83380 100644 --- a/apps/api/src/routes/content/schema-collection.ts +++ b/apps/api/src/routes/content/schema-collection.ts @@ -1,41 +1,10 @@ -import type { FastifyPluginAsync } from "fastify"; -import { Type } from "typebox"; import { CollectionMetaSchema } from "../../../../worker/src/tasks/sync-collection/types.ts"; +import { createSchemaRoute } from "./createSchemaRoute.ts"; -const SchemaCollectionResponseSchema = Type.Object( - {}, - { - additionalProperties: true, - description: - "A JSON Schema document describing valid collection frontmatter.", - examples: [CollectionMetaSchema], - }, +const schemaCollectionRoutes = createSchemaRoute( + "/content/schema/collection", + "Fetch the JSON Schema for collection frontmatter, as validated by the sync worker.", + CollectionMetaSchema, ); -const schemaCollectionRoutes: FastifyPluginAsync = async (fastify) => { - fastify.get( - "/content/schema/collection", - { - schema: { - description: - "Fetch the JSON Schema for collection frontmatter, as validated by the sync worker.", - response: { - 200: { - description: "Successful", - content: { - "application/json": { - schema: SchemaCollectionResponseSchema, - }, - }, - }, - }, - }, - }, - async (_request, reply) => { - reply.code(200); - reply.send(CollectionMetaSchema); - }, - ); -}; - export default schemaCollectionRoutes; diff --git a/apps/api/src/routes/content/schema-post.ts b/apps/api/src/routes/content/schema-post.ts index 1fe87850..4644e259 100644 --- a/apps/api/src/routes/content/schema-post.ts +++ b/apps/api/src/routes/content/schema-post.ts @@ -1,40 +1,10 @@ -import type { FastifyPluginAsync } from "fastify"; -import { Type } from "typebox"; import { PostMetaSchema } from "../../../../worker/src/tasks/sync-post/types.ts"; +import { createSchemaRoute } from "./createSchemaRoute.ts"; -const SchemaPostResponseSchema = Type.Object( - {}, - { - additionalProperties: true, - description: "A JSON Schema document describing valid post frontmatter.", - examples: [PostMetaSchema], - }, +const schemaPostRoutes = createSchemaRoute( + "/content/schema/post", + "Fetch the JSON Schema for post frontmatter, as validated by the sync worker.", + PostMetaSchema, ); -const schemaPostRoutes: FastifyPluginAsync = async (fastify) => { - fastify.get( - "/content/schema/post", - { - schema: { - description: - "Fetch the JSON Schema for post frontmatter, as validated by the sync worker.", - response: { - 200: { - description: "Successful", - content: { - "application/json": { - schema: SchemaPostResponseSchema, - }, - }, - }, - }, - }, - }, - async (_request, reply) => { - reply.code(200); - reply.send(PostMetaSchema); - }, - ); -}; - export default schemaPostRoutes; From a4170058538fe22750827e08aae9dac1e2fec8a2 Mon Sep 17 00:00:00 2001 From: Brian Bornino Date: Fri, 10 Jul 2026 07:44:45 -0700 Subject: [PATCH 3/4] refactor(api,worker,common): move frontmatter schemas to packages/common PostMetaSchema, CollectionMetaSchema, and AuthorMetaSchema move from apps/worker's per-task types.ts files into packages/common, resolving the cross-app import flagged in the PR description (apps/api was reaching into apps/worker via a relative path). typebox is already a packages/common dependency via the catalog, so no manifest change is needed. Co-Authored-By: Claude Sonnet 5 --- apps/api/src/routes/content/schema-author.test.ts | 2 +- apps/api/src/routes/content/schema-author.ts | 2 +- apps/api/src/routes/content/schema-collection.test.ts | 2 +- apps/api/src/routes/content/schema-collection.ts | 2 +- apps/api/src/routes/content/schema-post.test.ts | 2 +- apps/api/src/routes/content/schema-post.ts | 2 +- apps/worker/src/tasks/sync-author/processor.ts | 3 +-- apps/worker/src/tasks/sync-collection/processor.ts | 3 +-- apps/worker/src/tasks/sync-post/processor.ts | 3 +-- .../types.ts => packages/common/src/frontmatter/author.ts | 0 .../types.ts => packages/common/src/frontmatter/collection.ts | 0 .../types.ts => packages/common/src/frontmatter/post.ts | 0 packages/common/src/index.ts | 3 +++ 13 files changed, 12 insertions(+), 12 deletions(-) rename apps/worker/src/tasks/sync-author/types.ts => packages/common/src/frontmatter/author.ts (100%) rename apps/worker/src/tasks/sync-collection/types.ts => packages/common/src/frontmatter/collection.ts (100%) rename apps/worker/src/tasks/sync-post/types.ts => packages/common/src/frontmatter/post.ts (100%) diff --git a/apps/api/src/routes/content/schema-author.test.ts b/apps/api/src/routes/content/schema-author.test.ts index 5a55bb8d..d39a6d2e 100644 --- a/apps/api/src/routes/content/schema-author.test.ts +++ b/apps/api/src/routes/content/schema-author.test.ts @@ -1,6 +1,6 @@ import fastify, { type FastifyInstance } from "fastify"; import schemaAuthorRoutes from "./schema-author.ts"; -import { AuthorMetaSchema } from "../../../../worker/src/tasks/sync-author/types.ts"; +import { AuthorMetaSchema } from "@playfulprogramming/common"; describe("Schema Author Routes Tests", () => { let app: FastifyInstance; diff --git a/apps/api/src/routes/content/schema-author.ts b/apps/api/src/routes/content/schema-author.ts index 3e531b29..eb792daa 100644 --- a/apps/api/src/routes/content/schema-author.ts +++ b/apps/api/src/routes/content/schema-author.ts @@ -1,4 +1,4 @@ -import { AuthorMetaSchema } from "../../../../worker/src/tasks/sync-author/types.ts"; +import { AuthorMetaSchema } from "@playfulprogramming/common"; import { createSchemaRoute } from "./createSchemaRoute.ts"; const schemaAuthorRoutes = createSchemaRoute( diff --git a/apps/api/src/routes/content/schema-collection.test.ts b/apps/api/src/routes/content/schema-collection.test.ts index 477cb69a..cbd0f17f 100644 --- a/apps/api/src/routes/content/schema-collection.test.ts +++ b/apps/api/src/routes/content/schema-collection.test.ts @@ -1,6 +1,6 @@ import fastify, { type FastifyInstance } from "fastify"; import schemaCollectionRoutes from "./schema-collection.ts"; -import { CollectionMetaSchema } from "../../../../worker/src/tasks/sync-collection/types.ts"; +import { CollectionMetaSchema } from "@playfulprogramming/common"; describe("Schema Collection Routes Tests", () => { let app: FastifyInstance; diff --git a/apps/api/src/routes/content/schema-collection.ts b/apps/api/src/routes/content/schema-collection.ts index 74f83380..d8699d8f 100644 --- a/apps/api/src/routes/content/schema-collection.ts +++ b/apps/api/src/routes/content/schema-collection.ts @@ -1,4 +1,4 @@ -import { CollectionMetaSchema } from "../../../../worker/src/tasks/sync-collection/types.ts"; +import { CollectionMetaSchema } from "@playfulprogramming/common"; import { createSchemaRoute } from "./createSchemaRoute.ts"; const schemaCollectionRoutes = createSchemaRoute( diff --git a/apps/api/src/routes/content/schema-post.test.ts b/apps/api/src/routes/content/schema-post.test.ts index 092171e2..1630c2eb 100644 --- a/apps/api/src/routes/content/schema-post.test.ts +++ b/apps/api/src/routes/content/schema-post.test.ts @@ -1,6 +1,6 @@ import fastify, { type FastifyInstance } from "fastify"; import schemaPostRoutes from "./schema-post.ts"; -import { PostMetaSchema } from "../../../../worker/src/tasks/sync-post/types.ts"; +import { PostMetaSchema } from "@playfulprogramming/common"; describe("Schema Post Routes Tests", () => { let app: FastifyInstance; diff --git a/apps/api/src/routes/content/schema-post.ts b/apps/api/src/routes/content/schema-post.ts index 4644e259..6d19a681 100644 --- a/apps/api/src/routes/content/schema-post.ts +++ b/apps/api/src/routes/content/schema-post.ts @@ -1,4 +1,4 @@ -import { PostMetaSchema } from "../../../../worker/src/tasks/sync-post/types.ts"; +import { PostMetaSchema } from "@playfulprogramming/common"; import { createSchemaRoute } from "./createSchemaRoute.ts"; const schemaPostRoutes = createSchemaRoute( diff --git a/apps/worker/src/tasks/sync-author/processor.ts b/apps/worker/src/tasks/sync-author/processor.ts index 0937e33c..b0a267e6 100644 --- a/apps/worker/src/tasks/sync-author/processor.ts +++ b/apps/worker/src/tasks/sync-author/processor.ts @@ -1,11 +1,10 @@ -import { env } from "@playfulprogramming/common"; +import { env, AuthorMetaSchema } from "@playfulprogramming/common"; import { Tasks, createJob } from "@playfulprogramming/bullmq"; import { db, profiles, profileAchievements } from "@playfulprogramming/db"; import * as github from "@playfulprogramming/github-api"; import { s3 } from "@playfulprogramming/s3"; import { createProcessor } from "../../createProcessor.ts"; import matter from "gray-matter"; -import { AuthorMetaSchema } from "./types.ts"; import { Value } from "typebox/value"; import sharp from "sharp"; import { Readable } from "node:stream"; diff --git a/apps/worker/src/tasks/sync-collection/processor.ts b/apps/worker/src/tasks/sync-collection/processor.ts index 79ec0f1e..73a2224f 100644 --- a/apps/worker/src/tasks/sync-collection/processor.ts +++ b/apps/worker/src/tasks/sync-collection/processor.ts @@ -1,4 +1,4 @@ -import { env } from "@playfulprogramming/common"; +import { env, CollectionMetaSchema } from "@playfulprogramming/common"; import { Tasks, createJob } from "@playfulprogramming/bullmq"; import { collectionAuthors, @@ -11,7 +11,6 @@ import * as github from "@playfulprogramming/github-api"; import { createProcessor } from "../../createProcessor.ts"; import { eq } from "drizzle-orm"; import matter from "gray-matter"; -import { CollectionMetaSchema } from "./types.ts"; import { Value } from "typebox/value"; import sharp from "sharp"; import { Readable } from "node:stream"; diff --git a/apps/worker/src/tasks/sync-post/processor.ts b/apps/worker/src/tasks/sync-post/processor.ts index 87b39c9a..82653bbb 100644 --- a/apps/worker/src/tasks/sync-post/processor.ts +++ b/apps/worker/src/tasks/sync-post/processor.ts @@ -1,4 +1,4 @@ -import { env } from "@playfulprogramming/common"; +import { env, PostMetaSchema } from "@playfulprogramming/common"; import { Tasks, createJob } from "@playfulprogramming/bullmq"; import { db, @@ -13,7 +13,6 @@ import { createProcessor } from "../../createProcessor.ts"; import { eq } from "drizzle-orm"; import matter from "gray-matter"; import { Value } from "typebox/value"; -import { PostMetaSchema } from "./types.ts"; import { extractLocale } from "../../utils/extractLocale.ts"; import { extractMarkdownExcerpt } from "../../utils/extractMarkdownExcerpt.ts"; diff --git a/apps/worker/src/tasks/sync-author/types.ts b/packages/common/src/frontmatter/author.ts similarity index 100% rename from apps/worker/src/tasks/sync-author/types.ts rename to packages/common/src/frontmatter/author.ts diff --git a/apps/worker/src/tasks/sync-collection/types.ts b/packages/common/src/frontmatter/collection.ts similarity index 100% rename from apps/worker/src/tasks/sync-collection/types.ts rename to packages/common/src/frontmatter/collection.ts diff --git a/apps/worker/src/tasks/sync-post/types.ts b/packages/common/src/frontmatter/post.ts similarity index 100% rename from apps/worker/src/tasks/sync-post/types.ts rename to packages/common/src/frontmatter/post.ts diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 0561b3e3..d6c0508e 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1 +1,4 @@ export * from "./env.ts"; +export * from "./frontmatter/post.ts"; +export * from "./frontmatter/collection.ts"; +export * from "./frontmatter/author.ts"; From 1cbddd5cef8870e7b59061bf5a7e0fe388f1d23a Mon Sep 17 00:00:00 2001 From: James Fenn Date: Sat, 11 Jul 2026 12:51:14 -0400 Subject: [PATCH 4/4] fix sync-post --- apps/worker/src/tasks/sync-post/processor.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/worker/src/tasks/sync-post/processor.ts b/apps/worker/src/tasks/sync-post/processor.ts index 3ab46d15..2cf26c73 100644 --- a/apps/worker/src/tasks/sync-post/processor.ts +++ b/apps/worker/src/tasks/sync-post/processor.ts @@ -18,7 +18,6 @@ import sharp from "sharp"; import { Readable } from "node:stream"; import { extname } from "node:path/posix"; import { Response } from "undici"; -import { PostMetaSchema } from "./types.ts"; import { extractLocale } from "../../utils/extractLocale.ts"; import { extractMarkdownExcerpt } from "../../utils/extractMarkdownExcerpt.ts";