@stebrech/notion2eleventy
v0.2.2
Published
Eleventy plugin which downloads data from Notion to your 11ty project.
Downloads
8
Maintainers
Readme
notion2eleventy
notion2eleventy
is an Eleventy plugin which downloads content from Notion depending on a defined status. It fetches the content via Notions’s API and the the node package @notionhq/client
. The content will be converted to md with the help of the lovely node package notion-to-md
.
🚀 Features
- Downloads Notion content and assets to your Eleventy project.
- Status driven workflow:
- It fetches only posts in a specific status you‘ll define.
- At the end it updates the status.
- The assets will be downloaded to the directory of choice and renamed.
- The notion properties can be setup and added to the Markdown frontmatter (written in camel case).
- Multiple databases can be used and allows to create different post types.
- The cover image in Notion will be copied to the frontmatter by default.
[!IMPORTANT] As from v0.2.0 you need to configure
notion2eleventy
via the standardeleventy.config.js
.
Install the npm package
npm install @stebrech/notion2eleventy
Configure the plugin
Environment variables
Add a .env
file to the root folder and add the following variables:
NOTION_KEY=
CHECKSTATUS=
CHECKSTATUS2=
UPDATESTATUS=
NOTION_DB_POSTS=
- Add your API Key you created on www.notion.so/my-integrations.
- The name of the status value to take into account. Posts with other status will not be downloaded.
- Maybe you need another status to check. If not just use the same name as
CHECKSTATUS
. - Which status should the posts get after downloading it.
- The ID of the Notion database, see Retrieve a database
Configure the plugin in eleventy.config.js
The minimal configuration within the eleventy.config.js
(or .eleventy.js
) file looks like this:
const notion2eleventy = require("@stebrech/notion2eleventy");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(notion2eleventy);
};
This will use the default options. The one which need to be overwritten, have to be declared within an object (curly brackets).
Example:
const notion2eleventy = require("@stebrech/notion2eleventy");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(notion2eleventy, {
dbId: process.env.NOTION_DB_BLOG,
postType: "blog",
requiredMetadata: {
statusFieldType: "select",
},
optionalMetadata: {
textFields: ["Description"],
multiSelectFields: ["Tags"],
},
permalink: {
includesYear: true,
includesMonth: true,
publishPermalink: true,
},
downloadPaths: {
md: "src/blog/",
mdAddDatePrefix: false,
},
markdownPaths: {
img: "src/assets/img/",
},
});
};
All Config Options
| Option | Default value | Description |
|:-- |:-- |:-- |
| dbId
| process.env.NOTION_DB_POSTS
| ID of the Notion database; recommended to use env variable |
| postType
| "posts"
| Give the post type a specific name. It will be used with permalink.includesPostType
|
Required Notion metadata (database properties)
// Defaults
requiredMetadata: {
status: "Status",
statusFieldType: "status",
title: "Name",
},
| Option | Default value | Notion data type | Description |
|:-- |:-- |:-- |:-- |
| status
| "Status"
| see statusFieldType
| Name of the status field in Notion database |
| statusFieldType
| "status"
| "select"
or "status"
| Type of data field in Notion database |
| title
| "Name"
| title | Name of the title field in Notion database |
Optional Notion metadata (database properties)
// Defaults
optionalMetadata: {
layout: "",
date: "",
textFields: [],
multiSelectFields: [],
selectFields: [],
dateFields: [],
checkboxFields: [],
urlFields: [],
numberFields: [],
personFields: [],
relationFields: [],
formulaStringFields: [],
formulaNumberFields: [],
},
| Option | Default value | Database property type in Notion | Description |
|:-- |:-- |:-- |:-- |
| layout
| ""
| Select | In case the layout within a post type is variable. The value set in Notion will be value in the frontmatter, like layout: awesomeLayout
|
| date
| ""
| Date | RELATED: 11ty docs: Content dates |
| textFields
| []
| Text | Name of text fields in Notion database. The values must be in an array. Therefore you can set multiple text fields. |
| multiSelectFields
| []
| Multi-Select | Name of multi select fields in Notion database. The values must be in an array. Therefore you can set multiple multi select fields. |
| selectFields
| []
| Select | Name of select fields in Notion database. The values must be in an array. Therefore you can set multiple select fields. |
| dateFields
| []
| Date | Name of date fields in Notion database. The values must be in an array. Therefore you can set multiple date fields. |
| checkboxFields
| []
| Checkbox | Name of checkbox fields in Notion database. The values must be in an array. Therefore you can set multiple checkbox fields. |
| urlFields
| []
| URL | Name of url fields in Notion database. The values must be in an array. Therefore you can set multiple url fields. |
| numberFields
| []
| Number | Name of number fields in Notion database. The values must be in an array. Therefore you can set multiple number fields. |
| personFields
| []
| Person | Name of person fields in Notion database. The values must be in an array. Therefore you can set multiple person fields. |
| relationFields
| []
| Name of relation fields in Notion database | Important: requiredMetadata.title
, optionalMetadata.date
, downloadPaths.mdAddDatePrefix
and permalink.slug
must be configured the same in the database of the related post. The values must be in an array. Therefore you can set multiple relation fields. |
| formulaStringFields
| []
| Name of formula fields (type string) in Notion database | Formula fields which results to a string. The values must be in an array. Therefore you can set multiple formula fields. |
| formulaNumberFields
| []
| Name of formula fields (type number) in Notion database | Formula fields which results to a number. The values must be in an array. Therefore you can set multiple formular fields. |
Permalink settings
// Defaults
permalink: {
addPermalink: true,
includesPostType: true,
includesYear: false,
includesMonth: false,
includesDay: false,
slug: "",
publishPermalink: false,
}
| Option | Default value | Database property type in Notion | Description |
|:-- |:-- |:-- |:-- |
| addPermalink
| true
| – | Boolean (true
or false
) |
| includesPostType
| true
| – | Boolean (true
or false
) |
| includesYear
| false
| – | Boolean (true
or false
); Requires optionalMetada.date
|
| includesMonth
| false
| – | Boolean (true
or false
); Requires optionalMetada.date
; Makes only sense if includesYear
is true |
| includesDay
| false
| – | Boolean (true
or false
); Requires optionalMetada.date
; Makes only sense if includesYear
and includesMonth
is true |
| slug
| ""
| Text | Define a custom slug in Notion. If empty the slug will be created from the title. A trailing slash will be added automatically. addPermalink
must be true. |
| publishPermalink
| false
| URL | if true
, it requires a Notion property called "Permalink" of type "URL". |
Download paths
// Defaults
downloadPaths: {
md: "src/posts/",
mdAddDatePrefix: false,
img: "src/assets/img/",
imgAddDatePrefix: false,
movie: "src/assets/movie/",
movieAddDatePrefix: false,
pdf: "src/assets/pdf/",
pdfAddDatePrefix: false,
}
| Option | Default value | Description |
|:-- |:-- |:-- |
| md | "src/posts/"
| Download directory of the markdown files |
| mdAddDatePrefix | false
| Add a date prefix to markdown files. Requires optionalMetadata.date
|
| img | "src/assets/img/"
| Download directory of the image files |
| imgAddDatePrefix | false
| Add a date prefix to image files. Requires optionalMetada.date
|
| movie | "src/assets/movie/"
| Download directory of the movie files |
| movieAddDatePrefix | false
| Add a date prefix to movie files. Requires optionalMetada.date
|
| pdf | "src/assets/pdf/"
| Download directory of the pdf files |
| pdfAddDatePrefix | false
| Add a date prefix to pdf files. Requires optionalMetada.date
|
Markdown paths
// Defaults
markdownPaths: {
img: "/assets/img/",
movie: "/assets/movie/",
pdf: "/assets/pdf/",
}
| Option | Default value | Description |
|:-- |:-- |:-- |
| img
| "/assets/img/"
| Image paths which are used in the Markdown pages. |
| movie
| "/assets/movie/"
| Movie paths which are used in the Markdown pages. |
| pdf
| "/assets/pdf/"
| PDF paths which are used in the Markdown pages. |
Copy assets to output directory
// Defaults
copyAssetsToOutputFolder: {
img: true,
movie: true,
pdf: true,
}
| Option | Default value | Description |
|:-- |:-- |:-- |
| img
| true
| Copy the img download folder to the output folder (default is _site) with the img path configured in markdownPaths.img
|
| movie
| true
| Copy the movie download folder to the output folder (default is _site) with the movie path configured in markdownPaths.movie
|
| pdf
| true
| Copy the pdf download folder to the output folder (default is _site) with the pdf path configured in markdownPaths.pdf
|
Use multiple Notion databases
For creating multiple post types in Eleventy, you can create multiple Notion databases. Therefore you’ll call the plugin multiple times in your eleventy.config.js
.
Example:
const notion2eleventy = require("@stebrech/notion2eleventy");
module.exports = function (eleventyConfig) {
// Posts
eleventyConfig.addPlugin(notion2eleventy, {
requiredMetadata: {
title: "Title",
}
});
// Pages
eleventyConfig.addPlugin(notion2eleventy, {
dbId: process.env.NOTION_DB_PAGES,
postType: "pages",
requiredMetadata: {
title: "Title",
},
optionalMetadata: {
textFields: ["Description"],
},
downloadPaths: {
md: "src/pages/",
}
});
}
~~Extend scripts~~
~~Add the node script in your package.json like:~~
[!NOTE]
This is no longer necessary as of version v0.2.0
Feedback / Contribution
Please give me feedback dropping me a mail or reach out to me on the Mastodon.
If you find a bug or want to send a feature request please raise an issue on Github. You have a concrete solution – even better. I’m happy to receive your pull request on a separate branch.