Socket
Socket
Sign inDemoInstall

@agency-kit/notion-cms

Package Overview
Dependencies
106
Maintainers
1
Versions
23
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    @agency-kit/notion-cms

Turn Notion into a full-fledged headless content management system.


Version published
Weekly downloads
3
increased by200%
Maintainers
1
Created
Weekly downloads
 

Changelog

Source

0.10.0

Minor Changes

  • 8862d40: Fix: image cache plugin will now only run when a page needs updated (not using cache).

    New: cache PDFs using the image plugin. Long term this will likely be a unified plugin for fetching/caching all AWS S3 hosted Notion assets.

Patch Changes

  • bef414e: Fix: Keep terminal logging mechanism from swallowing important error messages.

    Fix: Throw an error when rootAlias is non-existant in Notion database.

    Fix: Show warning when there are multiple pages at the root level AND a rootAlias is set (you probably don't want that).

    Fix: Keep from failing when in quiet mode.

    Upd: Improve bundle size a tiny amount by switching terminal colors to picocolors.

  • 26dccd0: Fix: maintain proper spacing in codeblock renders.

Readme

Source

The Notion CMS

Leverage the power of Notion for your website's content organization and creation,

with the simplicity of Ghost's Content API.

NPM Version workflow NPM commit activity

notion -_  notionCMS  -_ prod

docs | quickstart

Features

🏗️  Framework agnostic - it’s just JS.
🌲 Build a collection-based CMS tree from your Notion database.
🎚️ Leverage database structure to control your routing structure.
⚙️ Geared for Static Site Generation.
📑  Transform Notion blocks → Markdown, plaintext, and (customizable) html.
🗃️ Optimized Content Caching for super fast builds.
🧩 Plugin ready with some powerful core plugins on the way.
🦾 Tagging, filtering, path queries, and tree-walking utilities.
⌨️ Totally Typesafe.

Install

npm install @agency-kit/notion-cms
pnpm add @agency-kit/notion-cms
yarn add @agency-kit/notion-cms

Why.

Notion excels at managing content. It also has a great API and SDK. But why is it so challenging to actually leverage Notion as a CMS (Content Management System) in production?

Until recently there wasn't support for sub-pages (sub-items in a database) in Notion. So most existing Notion-as-a-cms solutions don't provide a way to leverage this new feature, which turns out to be crucial for building a collection-based CMS. Another barrier is that pulling content from Notion can be time consuming. Responses can take a few seconds at times, the API provides a lot of data to sift through, and multiple calls to different endpoints are required in order to go from CMS database to the content for each page. All of this together results in a less than excellent developer experience when using a static site generator that often makes requests on each build.

NotionCMS exists to address each of these issues and provide an excellent developer experience while using Notion as your Content Management System.

The Database Structure

In order to make use of NotionCMS, you have to subscribe to a specific database structure. Its an extremely generic design that gives you all the things you need for basic sites but lends flexibility for types of content other than the standard web page, blog post etc.

See the structure in this template this template.

Basic Usage


// initialize
const myCoolCMS = new NotionCMS({
  databaseId: 'e4fcd5b3-1d6a-4afd-b951-10d56ce436ad',
  notionAPIKey: process.env.NOTION,
  // Other options
})

// Pull down all Notion content
await myCoolCMS.pull()

// Access the routes here:
console.log(myCoolCMS.routes)

// Access the page content here:
console.log(myCoolCMS.data)

// Access paths like this:
const postA = myCoolCMS.data['/posts']['/how-to-build-a-blog-with-notion']
const postB = myCoolCMS.data['/posts']['/how-to-use-notion-cms']

Advanced Usage


const customPlugin = () => {
  return {
    name: 'my-custom-plugin',
    hook: 'pre-parse', // other option is 'post-parse'
    // list of blocks to transform.
    // If hook is post parse, its the string of html parsed from blocks
    exec: (blocksOrHtml) => {
      // do some transformations,
      const transformedBlocksOrHtml = someXform(blocksOrHtml)
      return transformedBlocksOrHtml
    }
  }
}

const myAdvancedCMS = new NotionCMS({
  databaseId: 'e4fcd5b3-1d6a-4afd-b951-10d56ce436ad',
  notionAPIKey: process.env.NOTION,
  rootUrl: 'https://mycoolsite.com',
  localCacheDirectory: `${process.cwd()}/localcache/`,
  refreshTimeout: '1 hour',
  plugins: [customPlugin()],
})

await myAdvancedCMS.pull()

See the full API reference.

Some Helper methods

// returns page reference
myCMS.queryByPath('/full/path/to/page')

// returns an array of only child pages of a page looked up using the key.
// This runs queryByPath under the hood so you can save a step
myCMS.filterSubPages('/full/path/to/page' /* or Page reference*/)

// returns page object without any children - just the content. Useful for serializing and sending a
// single pages data to the client.
myCoolCMS.rejectSubPages('/full/path/to/page' /* or Page reference*/)

// Get tagged collections this way or by passing a single tag:
const tagged = myCoolCMS.getTaggedCollection(['blog', 'programming'])

// walk the CMS from the root node and perform some operation for each node.
// the node parameter will be of type PageContent so you have access to all of the page data
myCoolCMS.walk(node => console.log(node), '/partial/path/to/start')

// for async callbacks
await myCoolCMS.asyncWalk(async node => await asynchronousFunc())

Project Stats

Alt

Keywords

FAQs

Last updated on 11 Feb 2024

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc