Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions env.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
export {}

declare global {
namespace NodeJS {
interface ProcessEnv {
NEXT_PUBLIC_WORK_EXP: string
NEXT_PUBLIC_ALGOLIA_APP_ID: string
NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY: string
NEXT_PUBLIC_ALGOLIA_INDEX_NAME: string
ALGOLIA_SEARCH_ADMIN_KEY: string
}
}
}
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"version": "1.0.0",
"private": true,
"scripts": {
"algolia": "node ./scripts/build-algolia-search.js",
"dev": "next dev -p 3470",
"build": "next build",
"postbuild": "ts-node --esm scripts/generateFeed.ts",
Expand All @@ -13,8 +14,11 @@
"dependencies": {
"@kxxoling/react-github": "0.2.0",
"@leafac/rehype-shiki": "^2.2.1",
"@docsearch/css": "^3.3.3",
"@docsearch/react": "3",
"@tabler/icons-react": "^2.15.0",
"@vercel/analytics": "^1.0.1",
"algoliasearch": "^4.17.0",
"disqus-react": "^1.1.5",
"feed": "^4.2.2",
"framer-motion": "^10.12.16",
Expand All @@ -31,6 +35,7 @@
"rehype-slug": "^5.1.0",
"remark-gfm": "^3.0.1",
"shiki": "^0.14.2",
"remove-markdown": "^0.5.0",
"styled-components": "^5.3.9",
"twin.macro": "^3.3.0"
},
Expand All @@ -44,6 +49,7 @@
"@typescript-eslint/parser": "^5.58.0",
"autoprefixer": "^10.4.14",
"babel-plugin-styled-components": "^2.1.1",
"dotenv": "^16.0.3",
"eslint": "8.38.0",
"eslint-config-next": "13.3.0",
"eslint-config-prettier": "^8.8.0",
Expand Down
180 changes: 180 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

94 changes: 94 additions & 0 deletions scripts/build-algolia-search.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const fs = require('fs')
const path = require('path')

const algoliasearch = require('algoliasearch')
// eslint-disable-next-line node/no-unpublished-require
const dotenv = require('dotenv')
const matter = require('gray-matter')
const removeMd = require('remove-markdown')

const CONTENT_PATH = path.join(process.cwd(), 'posts/')

async function getFiles(dir) {
const dirents = await fs.promises.readdir(dir, { withFileTypes: true })
// @ts-ignore
const files = await Promise.all(
dirents
.filter((dirent) => !dirent.name.startsWith('.'))
.map((dirent) => {
return dirent.isDirectory()
? getFiles(path.join(dir, dirent.name))
: path.join(dir, dirent.name)
})
)
return Array.prototype.concat(...files)
}
const contentFilePaths = await getFiles(CONTENT_PATH)

async function getAllBlogPosts() {
const articles = contentFilePaths.map((filePath) => {
const source = fs.readFileSync(filePath)
const { content, data } = matter(source)

return {
content,
data,
filePath: filePath.replace(CONTENT_PATH, ''),
}
})

return articles
}

function transformPostsToSearchObjects(articles) {
const transformed = articles.map((article) => {
return {
objectID: article.filePath,
title:
article.data.title ||
article.content.split('\n')[0].replace('#', '').trim(),
description: article.data.description,
slug: article.filePath.replace(/\.(md|mdx)$/, ''),
tagsCollection: { tags: article.data.tags },
date: article.data.createdAt || article.data.updatedAt,
type: 'article',
content: removeMd(article.content).slice(0, 3000),
}
})

return transformed
}

// @ts-ignore @typescript-eslint/no-extra-semi
// eslint-disable-next-line @typescript-eslint/no-extra-semi
;(async function () {
dotenv.config()

try {
const articles = await getAllBlogPosts()

const transformed = transformPostsToSearchObjects(articles)

const client = algoliasearch(
process.env.NEXT_PUBLIC_ALGOLIA_APP_ID,
process.env.ALGOLIA_SEARCH_ADMIN_KEY
)

// initialize the index with your index name
const index = client.initIndex('blog.windrunner.me')

// add the data to the index
const algoliaResponse = await index.saveObjects(transformed)

console.log(
`Successfully added ${
algoliaResponse.objectIDs.length
} records to Algolia search! Object IDs:\n${algoliaResponse.objectIDs.join(
'\n'
)}`
)
} catch (err) {
console.error(err)
}
})()
Loading