import express from "express";
import { getWebflowClient, getSiteId } from "./webflow/client.js";
const app = express();
app.use(express.json());
app.get("/health", async (req, res) => {
const webflow = getWebflowClient();
try {
const { sites } = await webflow.sites.list();
res.json({ status: "healthy", sites: sites?.length });
} catch (error) {
res.status(503).json({ status: "unhealthy", error: String(error) });
}
});
app.listen(3000, () => console.log("Dev server: http://localhost:3000"));
import { describe, it, expect, vi, beforeEach } from "vitest";
import { WebflowClient } from "webflow-api";
vi.mock("webflow-api", () => ({
WebflowClient: vi.fn().mockImplementation(() => ({
sites: {
list: vi.fn().mockResolvedValue({
sites: [
{ id: "site-123", displayName: "Test Site", shortName: "test" },
],
}),
},
collections: {
list: vi.fn().mockResolvedValue({
collections: [
{
id: "col-456",
displayName: "Blog Posts",
slug: "blog-posts",
itemCount: 12,
fields: [
{ displayName: "Name", slug: "name", type: "PlainText", isRequired: true },
{ displayName: "Slug", slug: "slug", type: "PlainText", isRequired: true },
{ displayName: "Post Body", slug: "post-body", type: "RichText", isRequired: false },
],
},
],
}),
items: {
listItems: vi.fn().mockResolvedValue({
items: [
{ id: "item-789", isDraft: false, fieldData: { name: "Test Post", slug: "test-post" } },
],
pagination: { limit: 100, offset: 0, total: 1 },
}),
createItem: vi.fn().mockResolvedValue({
id: "item-new",
isDraft: true,
fieldData: { name: "New Post", slug: "new-post" },
}),
},
},
})),
}));
describe("Webflow Collections", () => {
let webflow: WebflowClient;
beforeEach(() => {
webflow = new WebflowClient({ accessToken: "test-token" });
});
it("should list collections for a site", async () => {
const { collections } = await webflow.collections.list("site-123");
expect(collections).toHaveLength(1);
expect(collections![0].displayName).toBe("Blog Posts");
});
it("should list items in a collection", async () => {
const { items } = await webflow.collections.items.listItems("col-456");
expect(items).toHaveLength(1);
expect(items![0].fieldData?.name).toBe("Test Post");
});
it("should create a CMS item", async () => {
const item = await webflow.collections.items.createItem("col-456", {
fieldData: { name: "New Post", slug: "new-post" },
});
expect(item.id).toBe("item-new");
expect(item.isDraft).toBe(true);
});
});