astro-loader-hashnode
Version:
Astro content loader for seamlessly integrating Hashnode blog posts into your Astro website using the Content Layer API
84 lines (63 loc) โข 2.45 kB
Markdown
# astro-loader-hashnode
Astro content loader for seamlessly integrating Hashnode blog posts into your Astro website using the Content Layer API.
## Installation
```bash
npm install astro-loader-hashnode
# or
pnpm add astro-loader-hashnode
# or
yarn add astro-loader-hashnode
```
## Quick Start
```ts
// src/content.config.ts
import { defineCollection } from 'astro:content';
import { hashnodeLoader } from 'astro-loader-hashnode';
export const collections = {
blog: defineCollection({
loader: hashnodeLoader({
publicationHost: 'your-blog.hashnode.dev',
}),
}),
};
```
## Features
- ๐ **Easy Setup** - One-line configuration to get started
- ๐ **Rich Content** - Full post content, metadata, and assets
- ๐ **Multiple Loaders** - Posts, series, drafts, and search
- ๐ฏ **Type Safety** - Full TypeScript support
- โก **Performance** - Built-in caching and pagination
- ๐ ๏ธ **Utilities** - SEO helpers, content processing, and more
- ๐งช **Schema Exposure** - Built-in Zod schema exported to Astro for type inference
- ๐งต **Incremental Updates** - Digest-based change detection to skip unchanged entries
- ๐จ๏ธ **Pre-render Support** - Each entry includes `rendered.html` so you can use Astro's `render(entry)` API
- ๐ **Post Preferences** - Access Hashnode preferences like `pinnedToBlog` and `isDelisted`
## Documentation
Visit our [documentation](https://github.com/raisedadead/astro-loader-hashnode#readme) for detailed usage instructions
and examples.
### Rendering Content
Astro can render an entry via `render(entry)`. Because the loader now supplies a `rendered` field (HTML + metadata), you
can also directly set HTML:
```astro
---
import { getEntry } from 'astro:content';
const post = await getEntry('blog', 'my-post-slug');
const { data, render } = post;
// Option 1: use pre-rendered HTML
const html = data.content.html;
// Option 2: let Astro render (works if markdown available)
const rendered = await render();
---
<article set:html={html} />
```
### Preferences Fields
Some extra post preference flags are included when present on Hashnode:
```ts
data.preferences?.pinnedToBlog; // boolean | undefined
data.preferences?.isDelisted; // boolean | undefined
```
### Change Detection (Digest)
Each stored entry includes a digest used internally to skip unchanged items on subsequent loads, improving build
performance.
## License
MIT ยฉ [Mrugesh Mohapatra](https://mrugesh.dev)