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 3cd8a7b..677ab2c 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,11 @@ 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, + }, databaseTypes: [], }) ``` @@ -99,9 +93,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 +119,9 @@ export const Post = defineDatabase(() => ({ })) export default makeSource({ - client, + client: { + auth: process.env.NOTION_TOKEN, + }, databaseTypes: [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..5313435 100644 --- a/content/docs/300-sources/125-notion/400-configure-renderer.mdx +++ b/content/docs/300-sources/125-notion/400-configure-renderer.mdx @@ -10,44 +10,51 @@ 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: ```text -npm install @notion-render/client +npm install @notionhq/client @notion-render/client ``` -### Pass the renderer to the source plugin +## 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). + +Each block has its own renderer called `block renderer` that takes in input the configuration and returns a string (the generated HTML). -```js -// contentlayer.config.js +You can find the list of block types on the [Official Notion API documentation](https://developers.notion.com/reference/block). + +### 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 * as notion from '@notionhq/client' 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 notion.Client({ auth: process.env.NOTION_TOKEN }) +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, }) ``` -## 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). - -Each block has its own renderer called `block renderer` that takes in input the configuration and returns a string (the generated HTML). - -You can find the list of block types on the [Official Notion API documentation](https://developers.notion.com/reference/block). +### Custom block renderer -### Create 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. @@ -62,17 +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 { NotionRenderer } from '@syneki/notion-render' +import { makeSource } from 'contentlayer-source-notion' +import { NotionRenderer } from '@notion-render/client' +import { Client } from '@notionhq/client' -const renderer = new NotionRenderer({ - renderers: [paragraphRenderer], -}) +const client = new Client({ auth: process.env.NOTION_TOKEN }) +const renderer = new NotionRenderer({ client }) -// or renderer.addBlockRenderer(paragraphRenderer) + +export default makeSource({ + client, + 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 8f9a8ea..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 @@ -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:** @@ -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. +
+ +
diff --git a/package.json b/package.json index 465338c..5a40cd8 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "autoprefixer": "^10.4.4", "broken-link-checker": "^0.7.8", "contentlayer": "^0.3.2", + "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 0000000..19fa10b Binary files /dev/null and b/public/images/notion/database-small.png differ diff --git a/src/components/landing-page/HowItWorks.tsx b/src/components/landing-page/HowItWorks.tsx index 30708ed..5cd05a1 100644 --- a/src/components/landing-page/HowItWorks.tsx +++ b/src/components/landing-page/HowItWorks.tsx @@ -7,6 +7,7 @@ import * as Tabs from '@radix-ui/react-tabs' import * as Tooltip from '@radix-ui/react-tooltip' import { Heading } from './Heading' import { Paragraph } from './Paragraph' +import Image from 'next/image' export const codeSnippets = { howItWorksStep1: [ @@ -85,6 +86,34 @@ export default function Post({ post }: { post: Post }) { ) }\ +`, + }, + ], + 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 4ee9b45..34f40f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -910,6 +910,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" @@ -962,7 +981,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/core@npm:1.12.0, @opentelemetry/core@npm:^1.5.0": +"@opentelemetry/core@npm:1.12.0": version: 1.12.0 resolution: "@opentelemetry/core@npm:1.12.0" dependencies: @@ -973,6 +992,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": version: 1.5.0 resolution: "@opentelemetry/core@npm:1.5.0" @@ -1063,7 +1093,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/resources@npm:1.12.0, @opentelemetry/resources@npm:^1.5.0": +"@opentelemetry/resources@npm:1.12.0": version: 1.12.0 resolution: "@opentelemetry/resources@npm:1.12.0" dependencies: @@ -1075,6 +1105,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": version: 1.5.0 resolution: "@opentelemetry/resources@npm:1.5.0" @@ -1101,7 +1143,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-trace-base@npm:1.12.0, @opentelemetry/sdk-trace-base@npm:^1.5.0": +"@opentelemetry/sdk-trace-base@npm:1.12.0": version: 1.12.0 resolution: "@opentelemetry/sdk-trace-base@npm:1.12.0" dependencies: @@ -1127,6 +1169,19 @@ __metadata: languageName: node linkType: hard +"@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-node@npm:^1.5.0": version: 1.12.0 resolution: "@opentelemetry/sdk-trace-node@npm:1.12.0" @@ -1143,13 +1198,20 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.12.0, @opentelemetry/semantic-conventions@npm:^1.5.0": +"@opentelemetry/semantic-conventions@npm:1.12.0": version: 1.12.0 resolution: "@opentelemetry/semantic-conventions@npm:1.12.0" checksum: 211fa2fffa82706f641cc785c4bef6ac03ef4cedeacb81972e832d09070e9cf7007867d87776af5c6baa9fddaabced476536962fd9ca1dc0487c9fb5f3f538b8 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": version: 1.5.0 resolution: "@opentelemetry/semantic-conventions@npm:1.5.0" @@ -1873,6 +1935,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" @@ -1930,6 +2002,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" @@ -2985,7 +3064,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: @@ -3088,6 +3167,7 @@ __metadata: cheerio: ^1.0.0-rc.10 classnames: ^2.3.1 contentlayer: ^0.3.2 + contentlayer-source-notion: ^0.0.1-alpha.26 date-fns: ^2.28.0 eslint: 8.13.0 eslint-config-next: 12.1.5 @@ -3115,6 +3195,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.2": version: 0.3.2 resolution: "contentlayer@npm:0.3.2" @@ -3305,6 +3400,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" @@ -4159,7 +4261,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 @@ -4377,6 +4479,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" @@ -5032,6 +5145,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" @@ -5515,6 +5640,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" @@ -6863,6 +6995,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" @@ -7039,6 +7180,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" @@ -7322,9 +7477,9 @@ __metadata: linkType: hard "oo-ascii-tree@npm:^1.80.0": - version: 1.80.0 - resolution: "oo-ascii-tree@npm:1.80.0" - checksum: 29cf9b38cef12ede8b973ef9cd5dd4d8c9c8742fc3978235d651d1a7ecb92453972ee5e8a9c6670f2e734bb9abbde16db96a39de22b47a2eebf1c6074c22e4eb + version: 1.82.0 + resolution: "oo-ascii-tree@npm:1.82.0" + checksum: a34c8bfd8abfb110f265408fdb64eda268f762a164a9972f49ff7d752c134a29561febb08dd3815331e97395b2e7f9a9fc7448a7a9fc3fe96aa70ba5fd0f044c languageName: node linkType: hard @@ -7397,6 +7552,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" @@ -7429,6 +7611,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" @@ -7656,6 +7845,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" @@ -8299,6 +8499,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" @@ -8396,6 +8603,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" @@ -8577,6 +8798,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" @@ -9141,9 +9369,9 @@ __metadata: linkType: hard "ts-pattern@npm:^4.2.2": - version: 4.2.2 - resolution: "ts-pattern@npm:4.2.2" - checksum: e9e818f0d4a1706930f81bb3e6fce69db998a584999b113ef0d0c73db5a810f0ead3a295393603f2fed4e17ba2cc90e6bf38223bea4f615a9e42deb514e91cc2 + version: 4.3.0 + resolution: "ts-pattern@npm:4.3.0" + checksum: f5167f6f721212c1e22f8590bb1fc21e27fd591d6fc5af0e467778f8e5b2dc1ae490cf5c633c83a3021a61283a671a53faf250b081c17c0f025e73eb775e5fe3 languageName: node linkType: hard @@ -9224,9 +9452,9 @@ __metadata: linkType: hard "type-fest@npm:^3.7.1": - version: 3.9.0 - resolution: "type-fest@npm:3.9.0" - checksum: daec3f72db7af2b285ac10a27231675a18418dea073a5fe40d9720472072786b6e38263a41e1c91daf99d7ecda80d5cf914b5bb0dd308593fa33ad9d3ff410dc + version: 3.11.0 + resolution: "type-fest@npm:3.11.0" + checksum: ebd7968301674d8022cd180aa34a685bda5962ad3c98da7280456f97468c1b12984f6a79d4eb4652f10e1f0ab42f7016121fd762068fd6255d4d0ccc069c2566 languageName: node linkType: hard