laforceit-blog/src/pages/search-index.json.js

82 lines
2.7 KiB
JavaScript

// src/pages/search-index.json.js
// Generates a JSON file with content from all collections for site-wide search
import { getCollection } from 'astro:content';
export async function get() {
// Get content from all collections
const posts = await getCollection('posts', ({ data }) => {
// Exclude draft posts in production
return import.meta.env.PROD ? !data.draft : true;
}).catch(() => []);
const projects = await getCollection('projects').catch(() => []);
const configurations = await getCollection('configurations').catch(() => []);
const externalPosts = await getCollection('external-posts').catch(() => []);
// Transform posts into search-friendly format
const searchablePosts = posts.map(post => ({
slug: post.slug,
title: post.data.title,
description: post.data.description || '',
pubDate: post.data.pubDate ? new Date(post.data.pubDate).toISOString() : '',
category: post.data.category || 'Uncategorized',
tags: post.data.tags || [],
readTime: post.data.readTime || '5 min read',
type: 'post',
url: `/posts/${post.slug}/`
}));
// Transform projects
const searchableProjects = projects.map(project => ({
slug: project.slug,
title: project.data.title,
description: project.data.description || '',
pubDate: project.data.pubDate ? new Date(project.data.pubDate).toISOString() : '',
category: project.data.category || 'Projects',
tags: project.data.tags || [],
type: 'project',
url: `/projects/${project.slug}/`
}));
// Transform configurations
const searchableConfigurations = configurations.map(config => ({
slug: config.slug,
title: config.data.title,
description: config.data.description || '',
pubDate: config.data.pubDate ? new Date(config.data.pubDate).toISOString() : '',
category: config.data.category || 'Configurations',
tags: config.data.tags || [],
type: 'configuration',
url: `/configurations/${config.slug}/`
}));
// Transform external posts
const searchableExternalPosts = externalPosts.map(post => ({
slug: post.slug,
title: post.data.title,
description: post.data.description || '',
pubDate: post.data.pubDate ? new Date(post.data.pubDate).toISOString() : '',
category: post.data.category || 'External',
tags: post.data.tags || [],
type: 'external',
url: post.data.url // Use the external URL directly
}));
// Combine all searchable content
const allSearchableContent = [
...searchablePosts,
...searchableProjects,
...searchableConfigurations,
...searchableExternalPosts
];
// Return JSON
return {
body: JSON.stringify(allSearchableContent),
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'max-age=3600'
}
};
}