From 11bbe1412bb5208d9ae9f80574b5c4d04c60406d Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Fri, 31 Mar 2023 06:07:08 +0200 Subject: [PATCH 1/4] docs(notion): improve doc with breaking changes --- .../125-notion/100-getting-started.mdx | 17 ++------- .../125-notion/400-configure-renderer.mdx | 36 +++++-------------- .../250-source-notion/100-make-source.mdx | 4 +-- 3 files changed, 14 insertions(+), 43 deletions(-) diff --git a/content/docs/300-sources/125-notion/100-getting-started.mdx b/content/docs/300-sources/125-notion/100-getting-started.mdx index 9a13195..654e8e2 100644 --- a/content/docs/300-sources/125-notion/100-getting-started.mdx +++ b/content/docs/300-sources/125-notion/100-getting-started.mdx @@ -58,13 +58,8 @@ Click on the `•••` in the top right corner of your database, then on **Add ### Install dependencies -You will need to install the following dependencies to get started: - -- `contentlayer-source-notion`: The Notion content source implementation for Contentlayer -- `@notionhq/client`: The official Notion JS SDK - ```text -npm install contentlayer-source-notion @notionhq/client +npm install contentlayer-source-notion ``` ### Configure Notion source plugin @@ -75,12 +70,9 @@ To configure the Notion Source plugin you need to create an instance of `@notion // contentlayer.config.js import { makeSource, defineDatabase } from 'contentlayer-source-notion' -import { Client } from '@notionhq/client' - -const client = new Client({ auth: process.env.NOTION_TOKEN }) export default makeSource({ - client, + client: { auth: process.env.NOTION_TOKEN }, documentTypes: [], }) ``` @@ -99,9 +91,6 @@ In our case we want to: // contentlayer.config.js import { makeSource, defineDatabase } from 'contentlayer-source-notion' -import * as notion from '@notionhq/client' - -const client = new notion.Client({ auth: process.env.NOTION_TOKEN }) export const Post = defineDatabase(() => ({ name: 'Post', @@ -128,7 +117,7 @@ export const Post = defineDatabase(() => ({ })) export default makeSource({ - client, + client: { auth: process.env.NOTION_TOKEN }, documentTypes: [Post], }) ``` diff --git a/content/docs/300-sources/125-notion/400-configure-renderer.mdx b/content/docs/300-sources/125-notion/400-configure-renderer.mdx index f252bff..3ed1736 100644 --- a/content/docs/300-sources/125-notion/400-configure-renderer.mdx +++ b/content/docs/300-sources/125-notion/400-configure-renderer.mdx @@ -10,11 +10,7 @@ excerpt: How to configure how the HTML is generated for Rich text content with c The `contentlayer-source-notion` uses [`@notion-render/client`](https://www.npmjs.com/package/@notion-render/client) under the hood to transform your Rich text content (Rich Text properties and pages content) into HTML that you can then use and style in your app. -## Use own instance of the renderer - -If you want to configure the renderer, you have to provide your own instance (by defaults one is generated for you). - -### Install `@notion-render/client` +## Install `@notion-render/client` Run the following command to add `@notion-render/client` to your dependencies: @@ -22,23 +18,6 @@ Run the following command to add `@notion-render/client` to your dependencies: npm install @notion-render/client ``` -### Pass the renderer to the source plugin - -```js -// contentlayer.config.js -import { makeSource } from 'contentlayer-source-notion' -import * as notion from '@notionhq/client' -import { NotionRenderer } from '@notion-render/client' - -const client = new notion.Client({ auth: process.env.NOTION_TOKEN }) -const renderer = new NotionRenderer({ client }) - -export default makeSource({ - client, - renderer, -}) -``` - ## Configure the renderer Notion Rich Text is basically a list of blocks, each block has a `type` (e.g. image) and contains its configuration (e.g. the image url). @@ -67,12 +46,15 @@ const paragraphRenderer = createBlockRenderer('par You can add your block renderers directly in the constructor parameters or with the method `addBlockRenderer`. ```typescript -import { NotionRenderer } from '@syneki/notion-render' - -const renderer = new NotionRenderer({ - renderers: [paragraphRenderer], -}) +import { makeSource } from 'contentlayer-source-notion' // or renderer.addBlockRenderer(paragraphRenderer) + +export default makeSource({ + client, + renderer: { + renderers: [paragraphRenderer], + }, +}) ``` diff --git a/content/docs/500-reference/250-source-notion/100-make-source.mdx b/content/docs/500-reference/250-source-notion/100-make-source.mdx index 8f9a8ea..ffb8ca6 100644 --- a/content/docs/500-reference/250-source-notion/100-make-source.mdx +++ b/content/docs/500-reference/250-source-notion/100-make-source.mdx @@ -27,7 +27,7 @@ export default makeSource({ - The `@notionhq/client` instance used to query the Notion API. + The `@notionhq/client` instance or options to query the Notion API. **Example:** @@ -50,7 +50,7 @@ export default makeSource({ - The `@notion-render/client` instance used to transform Notion Block into HTML. + The `@notion-render/client` instance or options to transform Notion Block into HTML. **Example:** From cb5d1d607418fe879da6b461eb1af9522178d9ca Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Wed, 24 May 2023 18:25:30 +0200 Subject: [PATCH 2/4] feat(homepage): add notion category to "How it works" section --- package.json | 1 + public/images/notion/database-small.png | Bin 0 -> 59475 bytes src/components/landing-page/HowItWorks.tsx | 115 +++++- yarn.lock | 388 ++++++++++++++++++++- 4 files changed, 493 insertions(+), 11 deletions(-) create mode 100644 public/images/notion/database-small.png diff --git a/package.json b/package.json index f5ea3aa..9d8559f 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "autoprefixer": "^10.4.4", "broken-link-checker": "^0.7.8", "contentlayer": "^0.3.0", + "contentlayer-source-notion": "^0.0.1-alpha.26", "eslint": "8.13.0", "eslint-config-next": "12.1.5", "eslint-plugin-import": "^2.26.0", diff --git a/public/images/notion/database-small.png b/public/images/notion/database-small.png new file mode 100644 index 0000000000000000000000000000000000000000..19fa10bcb1998be8ba6273a59745859a449b2339 GIT binary patch literal 59475 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 Ze7>U{7Nu_!z<(n>>gVka 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 z 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 ) }\ +`, + }, + ], + notionHowItWorksStep2: [ + { + file: 'contentlayer.config.ts', + lines: 20, + content: `\ +import { defineDatabase, makeSource } from 'contentlayer-source-notion' +import slugify from 'slugify' + +const Post = defineDatabase(() => ({ + name: 'Post', + databaseId: '50b6156388e445eaaca3a3599d6f7ade', + computedFields: { + slug: { + type: 'string', + resolve: (p) => slugify(p.Title), + }, + }, +})) + +export default makeSource({ + client: { + auth: process.env.NOTION_TOKEN + }, + databaseTypes: [Post], +})\ `, }, ], @@ -264,15 +293,80 @@ const content = { }, { title: 'Notion', - active: false, - steps: [], + active: true, + steps: [ + { + heading: 'Create your Notion database', + text: ( +

+ Create a new database or use an existing one. You can use all the feature of Notion to manage your + content: Columns, Automations, Views, etc. +

+ ), + image: { + url: '/images/notion/database-small.png', + alt: 'Data transformation', + width: 942, + height: 406, + }, + }, + { + heading: 'Configure your database', + text: ( +

+ When working with local markdown or MDX files, you tell Contentlayer the expected shape of your data + (document type definitions). +

+ ), + cta: { + label: 'Explore Example', + theme: 'primary', + icon: 'github' as IconName, + url: 'https://github.com/kerwanp/contentlayer-source-notion/tree/main/examples/node-script-notion', + }, + codeSnippetsKey: codesnippetKey('notionHowItWorksStep2'), + }, + { + heading: 'Your pages are transformed into data', + text: ( + <> +

+ Run Contentlayer to process your content. Do this as part of the Next.js dev server, or using the + Contentlayer CLI. +

+

+ This validates the content, then generates types definitions and outputs data objects ready to be + imported as a ESM module. +

+

The content of your pages are automatically transformed into HTML so you can easily render them.

+ + ), + dataTransformation: localStep2DataTransformation, + }, + { + heading: 'Import data into your application', + text: ( + <> +

+ Import the data just like you would any other JavaScript library. Use it to render pages, and pass down + as props to the components on those pages. +

+

+ Keep the development bundle small with tree-shaking and improve the development experience by using the + generated type definitions. +

+ + ), + codeSnippetsKey: codesnippetKey('howItWorksStep3'), + }, + ], }, ], } export const HowItWorks: FC<{ codeSnippets: CodeSnippets }> = ({ codeSnippets }) => { return ( -
+
{content.heading} @@ -308,7 +402,7 @@ export const HowItWorks: FC<{ codeSnippets: CodeSnippets }> = ({ codeSnippets }) className="rounded bg-gray-800 px-3 py-1.5 text-sm text-slate-100 shadow-xl shadow-white dark:bg-violet-200 dark:text-violet-900 dark:shadow-black" > Coming soon - + ), @@ -323,10 +417,10 @@ export const HowItWorks: FC<{ codeSnippets: CodeSnippets }> = ({ codeSnippets }) value={title.toLowerCase().replace(/ /g, '-')} className="relative focus:outline-none" > -
-
- {steps.map(({ heading, text, cta, codeSnippetsKey, dataTransformation }, index) => ( -
+
+
+ {steps.map(({ heading, text, cta, codeSnippetsKey, dataTransformation, image }, index) => ( +
@@ -353,6 +447,11 @@ export const HowItWorks: FC<{ codeSnippets: CodeSnippets }> = ({ codeSnippets })
)} + {image && ( +
+ {image.alt} +
+ )}
))} diff --git a/yarn.lock b/yarn.lock index 10ba636..8be323e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -74,6 +74,35 @@ __metadata: languageName: node linkType: hard +"@contentlayer/core@npm:0.3.2": + version: 0.3.2 + resolution: "@contentlayer/core@npm:0.3.2" + dependencies: + "@contentlayer/utils": 0.3.2 + camel-case: ^4.1.2 + comment-json: ^4.2.3 + esbuild: 0.17.x + gray-matter: ^4.0.3 + mdx-bundler: ^9.2.1 + rehype-stringify: ^9.0.3 + remark-frontmatter: ^4.0.1 + remark-parse: ^10.0.1 + remark-rehype: ^10.1.0 + source-map-support: ^0.5.21 + type-fest: ^3.7.1 + unified: ^10.1.2 + peerDependencies: + esbuild: 0.17.x + markdown-wasm: 1.x + peerDependenciesMeta: + esbuild: + optional: true + markdown-wasm: + optional: true + checksum: 41b1b8ac643b3fcec576e799d2b0c7927dd010ea48bb46c7cdf0bb2421122a9d91a005974083984327a3c4a05cd46632630946fdd89f4d5f7e21f5b005559ca6 + languageName: node + linkType: hard + "@contentlayer/source-files@npm:0.3.0": version: 0.3.0 resolution: "@contentlayer/source-files@npm:0.3.0" @@ -137,6 +166,40 @@ __metadata: languageName: node linkType: hard +"@contentlayer/utils@npm:0.3.2": + version: 0.3.2 + resolution: "@contentlayer/utils@npm:0.3.2" + dependencies: + "@effect-ts/core": ^0.60.2 + "@effect-ts/otel": ^0.14.0 + "@effect-ts/otel-exporter-trace-otlp-grpc": ^0.14.0 + "@effect-ts/otel-sdk-trace-node": ^0.14.0 + "@js-temporal/polyfill": ^0.4.3 + "@opentelemetry/api": ^1.1.0 + "@opentelemetry/core": ^1.5.0 + "@opentelemetry/exporter-trace-otlp-grpc": ^0.31.0 + "@opentelemetry/resources": ^1.5.0 + "@opentelemetry/sdk-trace-base": ^1.5.0 + "@opentelemetry/sdk-trace-node": ^1.5.0 + "@opentelemetry/semantic-conventions": ^1.5.0 + chokidar: ^3.5.3 + hash-wasm: ^4.9.0 + inflection: ^2.0.1 + memfs: ^3.5.1 + oo-ascii-tree: ^1.80.0 + ts-pattern: ^4.2.2 + type-fest: ^3.7.1 + peerDependenciesMeta: + "@effect-ts/core": + optional: true + "@effect-ts/otel": + optional: true + "@effect-ts/otel-node": + optional: true + checksum: f129a831d145b6bb9e987a1deb873927dbb8aceaa101e02917a35e8cdef0b03e4ed88270c1f46d944c966fa4170f635bc178ebf5baf3ab16b1e8f8cdd171ff26 + languageName: node + linkType: hard + "@corex/deepmerge@npm:^2.6.148": version: 2.6.148 resolution: "@corex/deepmerge@npm:2.6.148" @@ -909,6 +972,25 @@ __metadata: languageName: node linkType: hard +"@notion-render/client@npm:0.0.1-alpha.3": + version: 0.0.1-alpha.3 + resolution: "@notion-render/client@npm:0.0.1-alpha.3" + dependencies: + sanitize-html: ^2.10.0 + checksum: 1994f3e582adac945b3ff94f1c20c79cd1db1aaa86dae0064bfe2d935fa6f57866b9bc80c6f051bcb7428c00cec4108df274510a5d25c9b6418fa689a2fc21b7 + languageName: node + linkType: hard + +"@notionhq/client@npm:^2.2.3": + version: 2.2.5 + resolution: "@notionhq/client@npm:2.2.5" + dependencies: + "@types/node-fetch": ^2.5.10 + node-fetch: ^2.6.1 + checksum: e663e9dec58548226ea463fba1409ee9c5af26bdae71b2c5885c11b3c39b9238578ae067e31d5bd33b67cef492f603b264dcdad52692e33e03e0c0a085cb89f0 + languageName: node + linkType: hard + "@npmcli/fs@npm:^2.1.0": version: 2.1.2 resolution: "@npmcli/fs@npm:2.1.2" @@ -945,6 +1027,13 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api@npm:^1.1.0": + version: 1.4.1 + resolution: "@opentelemetry/api@npm:1.4.1" + checksum: e783c40d1a518abf9c4c5d65223237c1392cd9a6c53ac6e2c3ef0c05ff7266e3dfc4fd9874316dae0dcb7a97950878deb513bcbadfaad653d48f0215f2a0911b + languageName: node + linkType: hard + "@opentelemetry/api@npm:~1.1.0": version: 1.1.0 resolution: "@opentelemetry/api@npm:1.1.0" @@ -952,6 +1041,15 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/context-async-hooks@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/context-async-hooks@npm:1.13.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: 9627bf59805361b463b0e1d8aa64babc7dedbb746a989d41960789c0a1ff570327387c967c832117a224f78a161df1fca169412673d5474555a76e5d98d9c30a + languageName: node + linkType: hard + "@opentelemetry/context-async-hooks@npm:1.5.0": version: 1.5.0 resolution: "@opentelemetry/context-async-hooks@npm:1.5.0" @@ -961,6 +1059,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/core@npm:1.13.0, @opentelemetry/core@npm:^1.5.0": + version: 1.13.0 + resolution: "@opentelemetry/core@npm:1.13.0" + dependencies: + "@opentelemetry/semantic-conventions": 1.13.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: a69916bcb710f1241e98a58ac5f5dfbc3372fdcd6cb2a4b2d33cdeb941765ecbdeea029f60f650a5743a56f583b0f06b672566467b89db84a24f1304bf2e5205 + languageName: node + linkType: hard + "@opentelemetry/core@npm:1.5.0, @opentelemetry/core@npm:~1.5.0": version: 1.5.0 resolution: "@opentelemetry/core@npm:1.5.0" @@ -972,7 +1081,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-trace-otlp-grpc@npm:~0.31.0": +"@opentelemetry/exporter-trace-otlp-grpc@npm:^0.31.0, @opentelemetry/exporter-trace-otlp-grpc@npm:~0.31.0": version: 0.31.0 resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.31.0" dependencies: @@ -1029,6 +1138,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/propagator-b3@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/propagator-b3@npm:1.13.0" + dependencies: + "@opentelemetry/core": 1.13.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: 8ee0db7d47efe21c5c8128621a816221a8e94831b410d60b02d7859d373d55521b3574c288014ffbb9916aaad00b259fe4d92dfeab7c06398e96f94e2b2bea63 + languageName: node + linkType: hard + "@opentelemetry/propagator-b3@npm:1.5.0": version: 1.5.0 resolution: "@opentelemetry/propagator-b3@npm:1.5.0" @@ -1040,6 +1160,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/propagator-jaeger@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/propagator-jaeger@npm:1.13.0" + dependencies: + "@opentelemetry/core": 1.13.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: 8adf1b7256649c7da9eb3c5d343d8e7e00b45aa7ff64a0e7572453218de26b58b4944ba3952a34ccc008535783e18fb39636a7ca3dfb233d40327269f378cac7 + languageName: node + linkType: hard + "@opentelemetry/propagator-jaeger@npm:1.5.0": version: 1.5.0 resolution: "@opentelemetry/propagator-jaeger@npm:1.5.0" @@ -1051,6 +1182,18 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/resources@npm:1.13.0, @opentelemetry/resources@npm:^1.5.0": + version: 1.13.0 + resolution: "@opentelemetry/resources@npm:1.13.0" + dependencies: + "@opentelemetry/core": 1.13.0 + "@opentelemetry/semantic-conventions": 1.13.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: ef0a11596f27b5e1c13b74357da06c5c2725a1056df0a583562dbcc739927ad85bb8bdec4e01f4b43f348b448c0146c033b135840a7d388b75cc751a33a6364e + languageName: node + linkType: hard + "@opentelemetry/resources@npm:1.5.0, @opentelemetry/resources@npm:~1.5.0": version: 1.5.0 resolution: "@opentelemetry/resources@npm:1.5.0" @@ -1077,6 +1220,19 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-trace-base@npm:1.13.0, @opentelemetry/sdk-trace-base@npm:^1.5.0": + version: 1.13.0 + resolution: "@opentelemetry/sdk-trace-base@npm:1.13.0" + dependencies: + "@opentelemetry/core": 1.13.0 + "@opentelemetry/resources": 1.13.0 + "@opentelemetry/semantic-conventions": 1.13.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: bfe95d56de998cf4219fa9293c9d2ebbd90d93391bbb8360a1806465983b6665cef58bc2938a8e318ae0712e2482ebed7a9db5d9e8bb6fc010199f5fa8f1592e + languageName: node + linkType: hard + "@opentelemetry/sdk-trace-base@npm:1.5.0, @opentelemetry/sdk-trace-base@npm:~1.5.0": version: 1.5.0 resolution: "@opentelemetry/sdk-trace-base@npm:1.5.0" @@ -1090,6 +1246,22 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-trace-node@npm:^1.5.0": + version: 1.13.0 + resolution: "@opentelemetry/sdk-trace-node@npm:1.13.0" + dependencies: + "@opentelemetry/context-async-hooks": 1.13.0 + "@opentelemetry/core": 1.13.0 + "@opentelemetry/propagator-b3": 1.13.0 + "@opentelemetry/propagator-jaeger": 1.13.0 + "@opentelemetry/sdk-trace-base": 1.13.0 + semver: ^7.3.5 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: d9a9ff07dc05c60a7106f4e0b026c5237c39a0fd3460c43a894d8ba35be1d2ba32a3a24e3cabb02370e0901116ddf3893f976b2592de9c1fc9a9c96593de5079 + languageName: node + linkType: hard + "@opentelemetry/sdk-trace-node@npm:~1.5.0": version: 1.5.0 resolution: "@opentelemetry/sdk-trace-node@npm:1.5.0" @@ -1106,6 +1278,13 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/semantic-conventions@npm:1.13.0, @opentelemetry/semantic-conventions@npm:^1.5.0": + version: 1.13.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.13.0" + checksum: 9cccf1d73315fed3920bb2201c0e82f66e58dddfa475314b6613780c2804570d6f657be3894eb8b84a2a543c9b8cd520587f5d6cd4b62bc6731d7299b4c5ee69 + languageName: node + linkType: hard + "@opentelemetry/semantic-conventions@npm:1.5.0, @opentelemetry/semantic-conventions@npm:~1.5.0": version: 1.5.0 resolution: "@opentelemetry/semantic-conventions@npm:1.5.0" @@ -1829,6 +2008,16 @@ __metadata: languageName: node linkType: hard +"@types/node-fetch@npm:^2.5.10": + version: 2.6.4 + resolution: "@types/node-fetch@npm:2.6.4" + dependencies: + "@types/node": "*" + form-data: ^3.0.0 + checksum: f3e1d881bb42269e676ecaf49f0e096ab345e22823a2b2d071d60619414817fe02df48a31a8d05adb23054028a2a65521bdb3906ceb763ab6d3339c8d8775058 + languageName: node + linkType: hard + "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": version: 18.11.18 resolution: "@types/node@npm:18.11.18" @@ -1886,6 +2075,13 @@ __metadata: languageName: node linkType: hard +"@types/retry@npm:0.12.1": + version: 0.12.1 + resolution: "@types/retry@npm:0.12.1" + checksum: 5f46b2556053655f78262bb33040dc58417c900457cc63ff37d6c35349814471453ef511af0cec76a540c601296cd2b22f64bab1ab649c0dacc0223765ba876c + languageName: node + linkType: hard + "@types/scheduler@npm:*": version: 0.16.2 resolution: "@types/scheduler@npm:0.16.2" @@ -2941,7 +3137,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:~1.0.6": +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -3044,6 +3240,7 @@ __metadata: cheerio: ^1.0.0-rc.10 classnames: ^2.3.1 contentlayer: ^0.3.0 + contentlayer-source-notion: ^0.0.1-alpha.26 date-fns: ^2.28.0 eslint: 8.13.0 eslint-config-next: 12.1.5 @@ -3071,6 +3268,21 @@ __metadata: languageName: unknown linkType: soft +"contentlayer-source-notion@npm:^0.0.1-alpha.26": + version: 0.0.1-alpha.26 + resolution: "contentlayer-source-notion@npm:0.0.1-alpha.26" + dependencies: + "@contentlayer/core": 0.3.2 + "@contentlayer/utils": 0.3.2 + "@notion-render/client": 0.0.1-alpha.3 + "@notionhq/client": ^2.2.3 + p-queue: ^7.3.4 + p-retry: ^5.1.2 + slugify: ^1.6.5 + checksum: 8522d39e6b256910bd4db3996e59c0104d4ad162277fac3cf779a2f83366b4f31e88b775b53b5c0024708237b71279310449e1cdac7f1eef9139947f14142d88 + languageName: node + linkType: hard + "contentlayer@npm:^0.3.0": version: 0.3.0 resolution: "contentlayer@npm:0.3.0" @@ -3261,6 +3473,13 @@ __metadata: languageName: node linkType: hard +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 + languageName: node + linkType: hard + "default-user-agent@npm:^1.0.0": version: 1.0.0 resolution: "default-user-agent@npm:1.0.0" @@ -4115,7 +4334,7 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0": +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 @@ -4333,6 +4552,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^3.0.0": + version: 3.0.1 + resolution: "form-data@npm:3.0.1" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: b019e8d35c8afc14a2bd8a7a92fa4f525a4726b6d5a9740e8d2623c30e308fbb58dc8469f90415a856698933c8479b01646a9dff33c87cc4e76d72aedbbf860d + languageName: node + linkType: hard + "form-data@npm:~2.3.2": version: 2.3.3 resolution: "form-data@npm:2.3.3" @@ -4419,6 +4649,13 @@ __metadata: languageName: node linkType: hard +"fs-monkey@npm:^1.0.3": + version: 1.0.3 + resolution: "fs-monkey@npm:1.0.3" + checksum: cf50804833f9b88a476911ae911fe50f61a98d986df52f890bd97e7262796d023698cb2309fa9b74fdd8974f04315b648748a0a8ee059e7d5257b293bfc409c0 + languageName: node + linkType: hard + "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -4981,6 +5218,18 @@ __metadata: languageName: node linkType: hard +"htmlparser2@npm:^8.0.0": + version: 8.0.2 + resolution: "htmlparser2@npm:8.0.2" + dependencies: + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + domutils: ^3.0.1 + entities: ^4.4.0 + checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700 + languageName: node + linkType: hard + "htmlparser2@npm:^8.0.1": version: 8.0.1 resolution: "htmlparser2@npm:8.0.1" @@ -5464,6 +5713,13 @@ __metadata: languageName: node linkType: hard +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c + languageName: node + linkType: hard + "is-promise@npm:^4.0.0": version: 4.0.0 resolution: "is-promise@npm:4.0.0" @@ -6200,6 +6456,15 @@ __metadata: languageName: node linkType: hard +"memfs@npm:^3.5.1": + version: 3.5.1 + resolution: "memfs@npm:3.5.1" + dependencies: + fs-monkey: ^1.0.3 + checksum: fcd037566a4bbb00d61dc991858395ccc06267ab5fe9471aeff28433f2a210bf5dd999e64e8b5473f8244f00dfb7ff3221b5c2fe41ff98af1439e5e2168fc410 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -6803,6 +7068,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.6": + version: 3.3.6 + resolution: "nanoid@npm:3.3.6" + bin: + nanoid: bin/nanoid.cjs + checksum: 7d0eda657002738aa5206107bd0580aead6c95c460ef1bdd0b1a87a9c7ae6277ac2e9b945306aaa5b32c6dcb7feaf462d0f552e7f8b5718abfc6ead5c94a71b3 + languageName: node + linkType: hard + "napi-build-utils@npm:^1.0.1": version: 1.0.2 resolution: "napi-build-utils@npm:1.0.2" @@ -6979,6 +7253,20 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^2.6.1": + version: 2.6.11 + resolution: "node-fetch@npm:2.6.11" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 249d0666a9497553384d46b5ab296ba223521ac88fed4d8a17d6ee6c2efb0fc890f3e8091cafe7f9fba8151a5b8d925db2671543b3409a56c3cd522b468b47b3 + languageName: node + linkType: hard + "node-fetch@npm:^3.0.0": version: 3.3.0 resolution: "node-fetch@npm:3.3.0" @@ -7268,6 +7556,13 @@ __metadata: languageName: node linkType: hard +"oo-ascii-tree@npm:^1.80.0": + version: 1.82.0 + resolution: "oo-ascii-tree@npm:1.82.0" + checksum: a34c8bfd8abfb110f265408fdb64eda268f762a164a9972f49ff7d752c134a29561febb08dd3815331e97395b2e7f9a9fc7448a7a9fc3fe96aa70ba5fd0f044c + languageName: node + linkType: hard + "optionator@npm:^0.9.1": version: 0.9.1 resolution: "optionator@npm:0.9.1" @@ -7337,6 +7632,33 @@ __metadata: languageName: node linkType: hard +"p-queue@npm:^7.3.4": + version: 7.3.4 + resolution: "p-queue@npm:7.3.4" + dependencies: + eventemitter3: ^4.0.7 + p-timeout: ^5.0.2 + checksum: a21b8a4dd75f64a4988e4468cc344d1b45132506ddd2c771932d3de446d108ee68713b629e0d3f0809c227bc10eafc613edde6ae741d9f60db89b6031e40921c + languageName: node + linkType: hard + +"p-retry@npm:^5.1.2": + version: 5.1.2 + resolution: "p-retry@npm:5.1.2" + dependencies: + "@types/retry": 0.12.1 + retry: ^0.13.1 + checksum: f063c08b1adc3cf7c01de01eb2dbda841970229f9f229c5167ebf4e2080d8a38b1f4e6eccefac74bca97cfaf4436d0a0eeb0b551175b26bc8b3116195f61bba8 + languageName: node + linkType: hard + +"p-timeout@npm:^5.0.2": + version: 5.1.0 + resolution: "p-timeout@npm:5.1.0" + checksum: f5cd4e17301ff1ff1d8dbf2817df0ad88c6bba99349fc24d8d181827176ad4f8aca649190b8a5b1a428dfd6ddc091af4606835d3e0cb0656e04045da5c9e270c + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -7369,6 +7691,13 @@ __metadata: languageName: node linkType: hard +"parse-srcset@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-srcset@npm:1.0.2" + checksum: 3a0380380c6082021fcce982f0b89fb8a493ce9dfd7d308e5e6d855201e80db8b90438649b31fdd82a3d6089a8ca17dccddaa2b730a718389af4c037b8539ebf + languageName: node + linkType: hard + "parse5-htmlparser2-tree-adapter@npm:^7.0.0": version: 7.0.0 resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" @@ -7596,6 +7925,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.3.11": + version: 8.4.23 + resolution: "postcss@npm:8.4.23" + dependencies: + nanoid: ^3.3.6 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: 8bb9d1b2ea6e694f8987d4f18c94617971b2b8d141602725fedcc2222fdc413b776a6e1b969a25d627d7b2681ca5aabb56f59e727ef94072e1b6ac8412105a2f + languageName: node + linkType: hard + "prebuild-install@npm:^7.1.1": version: 7.1.1 resolution: "prebuild-install@npm:7.1.1" @@ -8239,6 +8579,13 @@ __metadata: languageName: node linkType: hard +"retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -8336,6 +8683,20 @@ __metadata: languageName: node linkType: hard +"sanitize-html@npm:^2.10.0": + version: 2.10.0 + resolution: "sanitize-html@npm:2.10.0" + dependencies: + deepmerge: ^4.2.2 + escape-string-regexp: ^4.0.0 + htmlparser2: ^8.0.0 + is-plain-object: ^5.0.0 + parse-srcset: ^1.0.2 + postcss: ^8.3.11 + checksum: 0cb2bb330ed966a4d667b1890322dd868a67f527f87c04d7e3be1688fcfda20f7452a9a7744870751f51e255742e7264a287d9bcfcd64d4cd74a3c99f99c73d2 + languageName: node + linkType: hard + "scheduler@npm:^0.21.0": version: 0.21.0 resolution: "scheduler@npm:0.21.0" @@ -8517,6 +8878,13 @@ __metadata: languageName: node linkType: hard +"slugify@npm:^1.6.5": + version: 1.6.6 + resolution: "slugify@npm:1.6.6" + checksum: 04773c2d3b7aea8d2a61fa47cc7e5d29ce04e1a96cbaec409da57139df906acb3a449fac30b167d203212c806e73690abd4ff94fbad0a9a7b7ea109a2a638ae9 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -9087,6 +9455,13 @@ __metadata: languageName: node linkType: hard +"ts-pattern@npm:^4.2.2": + version: 4.3.0 + resolution: "ts-pattern@npm:4.3.0" + checksum: f5167f6f721212c1e22f8590bb1fc21e27fd591d6fc5af0e467778f8e5b2dc1ae490cf5c633c83a3021a61283a671a53faf250b081c17c0f025e73eb775e5fe3 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.11.0, tsconfig-paths@npm:^3.14.1, tsconfig-paths@npm:^3.9.0": version: 3.14.1 resolution: "tsconfig-paths@npm:3.14.1" @@ -9170,6 +9545,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^3.7.1": + version: 3.11.0 + resolution: "type-fest@npm:3.11.0" + checksum: ebd7968301674d8022cd180aa34a685bda5962ad3c98da7280456f97468c1b12984f6a79d4eb4652f10e1f0ab42f7016121fd762068fd6255d4d0ccc069c2566 + languageName: node + linkType: hard + "typed-array-length@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" From 3a3e919fff376bb0df1579789bf89021abc30f28 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Wed, 24 May 2023 18:25:52 +0200 Subject: [PATCH 3/4] feat(notion): update notion documentation with latest versions --- .../125-notion/400-configure-renderer.mdx | 44 ++++++++++++++++--- .../250-source-notion/100-make-source.mdx | 25 +++++++++++ 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/content/docs/300-sources/125-notion/400-configure-renderer.mdx b/content/docs/300-sources/125-notion/400-configure-renderer.mdx index 3ed1736..5313435 100644 --- a/content/docs/300-sources/125-notion/400-configure-renderer.mdx +++ b/content/docs/300-sources/125-notion/400-configure-renderer.mdx @@ -15,7 +15,7 @@ The `contentlayer-source-notion` uses [`@notion-render/client`](https://www.npmj Run the following command to add `@notion-render/client` to your dependencies: ```text -npm install @notion-render/client +npm install @notionhq/client @notion-render/client ``` ## Configure the renderer @@ -26,7 +26,35 @@ Each block has its own renderer called `block renderer` that takes in input the You can find the list of block types on the [Official Notion API documentation](https://developers.notion.com/reference/block). -### Create block renderer +### Use plugins + +There are multiple plugins available for `@notion-client/render`: + +- `@notion-render/hljs-plugin`: Use [Highlight.js](https://highlightjs.org/) to colorize your Code blocks. +- `@notion-render/bookmark-plugin`: Improve bookmark blocks by gathering the targeted website metadata. + +```typescript +import { makeSource } from 'contentlayer-source-notion' +import { NotionRenderer } from '@notion-render/client' +import { Client } from '@notionhq/client' +import hljs from '@notion-render/hljs-plugin' +import bookmark from '@notion-render/bookmark-plugin' + +const client = new Client({ auth: process.env.NOTION_TOKEN }) +const renderer = new NotionRenderer({ client }) + +renderer.use(bookmark) +renderer.use(hljs) + +export default makeSource({ + client, + renderer, +}) +``` + +### Custom block renderer + +#### Create the block renderer You can create a block renderer by using the `createBlockRenderer` function. The first parameter is the type of block, the second is the function used to render this type of block. @@ -41,20 +69,22 @@ const paragraphRenderer = createBlockRenderer('par }) ``` -### Add the block renderer +#### Add the block renderer You can add your block renderers directly in the constructor parameters or with the method `addBlockRenderer`. ```typescript import { makeSource } from 'contentlayer-source-notion' +import { NotionRenderer } from '@notion-render/client' +import { Client } from '@notionhq/client' + +const client = new Client({ auth: process.env.NOTION_TOKEN }) +const renderer = new NotionRenderer({ client }) -// or renderer.addBlockRenderer(paragraphRenderer) export default makeSource({ client, - renderer: { - renderers: [paragraphRenderer], - }, + renderer, }) ``` diff --git a/content/docs/500-reference/250-source-notion/100-make-source.mdx b/content/docs/500-reference/250-source-notion/100-make-source.mdx index ffb8ca6..cb2733f 100644 --- a/content/docs/500-reference/250-source-notion/100-make-source.mdx +++ b/content/docs/500-reference/250-source-notion/100-make-source.mdx @@ -99,4 +99,29 @@ export default makeSource({ ``` + + ### `dev` + + + + Provides the ability to configure the development server when running `contentlayer dev` or `next dev` (with `next-contentlayer`). + + **Options:** + + - `polling` (default: `5000`): Delay in ms between each check for updated pages (can be set to `false` to disable). + + **Example:** + + ```js + export default makeSource({ + dev: { + polling: 10_000 + }, + }) + ``` +
+ ⚠ Currently it does not update the schema, only your pages content and properties values. +
+ +
From ab25fb24761f0dd548955bfd9ba39029c7021002 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Wed, 24 May 2023 18:32:16 +0200 Subject: [PATCH 4/4] fix(notion): use makeSource parameters to set notion token --- .../300-sources/125-notion/100-getting-started.mdx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/content/docs/300-sources/125-notion/100-getting-started.mdx b/content/docs/300-sources/125-notion/100-getting-started.mdx index 3dde12f..677ab2c 100644 --- a/content/docs/300-sources/125-notion/100-getting-started.mdx +++ b/content/docs/300-sources/125-notion/100-getting-started.mdx @@ -72,7 +72,9 @@ To configure the Notion Source plugin you need to create an instance of `@notion import { makeSource, defineDatabase } from 'contentlayer-source-notion' export default makeSource({ - client, + client: { + auth: process.env.NOTION_TOKEN, + }, databaseTypes: [], }) ``` @@ -92,8 +94,6 @@ In our case we want to: import { makeSource, defineDatabase } from 'contentlayer-source-notion' -const client = new notion.Client({ auth: process.env.NOTION_TOKEN }) - export const Post = defineDatabase(() => ({ name: 'Post', databaseId: '', @@ -119,7 +119,9 @@ export const Post = defineDatabase(() => ({ })) export default makeSource({ - client, + client: { + auth: process.env.NOTION_TOKEN, + }, databaseTypes: [Post], }) ```