A .json.ts or .json.js file in content/ is a data module. bongo runs it and writes its default export as JSON, without the script extension. Use data modules for search indexes and other JSON files.
Paths
| File | Output |
|---|---|
content/search.json.ts |
/search.json |
content/blog/posts.json.js |
/blog/posts.json |
The default export
The default export is a value, or a function that returns one. The function receives $site, $pages, $section, $tags, $data, and $utils, as .hbs content does, and it may be async. $section holds the pages in the module's own folder. Type the function with Build.Data:
import type { Build } from 'bongo';
export default ({ $pages }: Build.Data) => $pages
.filter(page => page.section === 'blog')
.map(page => ({ title: page.title, path: page.path }));Each page in $pages has its headings. A search index can list the sections of each page without a second read of the sources:
import type { Build } from 'bongo';
export default ({ $pages }: Build.Data) => $pages.map(page => ({
title: page.title,
path: page.path,
sections: page.headings.filter(h => h.level === 2).map(h => ({ id: h.id, text: h.text })),
}));bongo runs data modules once every page is known. See How a build works.
How it differs from a page
A data module is like an output file:
- It is not a page. It gets no layout, and it is not in
$pages,$section, or$tags. bongo never minifies it or passes it to$hooks.transform. The JSON is always compact. - It may import local files and packages, as the config does. It runs on every build, so it always reads the current pages.
bongo devserves it asapplication/json. It runs again after every change to a page, to the module, or to a local file that it imports.
Errors
The build fails, and the error names the file, when the module:
- has no default export,
- throws,
- returns something that JSON cannot hold, such as
undefined.