notion-to-md 2.4.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -195,11 +195,38 @@ console.log(result);
195
195
  ![image](https://media.giphy.com/media/Ju7l5y9osyymQ/giphy.gif)
196
196
  ```
197
197
 
198
+ ## Custom Transformers
199
+ You can define your own custom transformer for a notion type, to parse and return your own string.
200
+ `setCustomTransformer(type, func)` will overload the parsing for the giving type.
201
+
202
+ ```js
203
+ const { NotionToMarkdown } = require("notion-to-md");
204
+ const n2m = new NotionToMarkdown({ notionClient: notion });
205
+ n2m.setCustomTransformer('embed', async (block) => {
206
+ const {embed} = block as any;
207
+ if (!embed?.url) return '';
208
+ return `<figure>
209
+ <iframe src="${embed?.url}"></iframe>
210
+ <figcaption>${await n2m.blockToMarkdown(embed?.caption)}</figcaption>
211
+ </figure>`;
212
+ });
213
+ const result = n2m.blockToMarkdown(block);
214
+ // Result will now parse the `embed` type with your custom function.
215
+ ```
216
+ **Note** Be aware that `setCustomTransformer` will take only the last function for the given type. You can't set two different transforms for the same type.
217
+
198
218
  ## Contribution
199
219
 
200
220
  Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
201
221
  Please make sure to update tests as appropriate.
202
222
 
223
+ ## Contributers
224
+
225
+ <a href="https://github.com/souvikinator/notion-to-md/graphs/contributors">
226
+ <img src="https://contrib.rocks/image?repo=souvikinator/notion-to-md" />
227
+ </a>
228
+
229
+
203
230
  ## License
204
231
 
205
232
  [MIT](https://choosealicense.com/licenses/mit/)
@@ -1,10 +1,12 @@
1
- import { Annotations, ListBlockChildrenResponseResult, ListBlockChildrenResponseResults, MdBlock, NotionToMarkdownOptions } from "./types";
1
+ import { Annotations, ListBlockChildrenResponseResult, ListBlockChildrenResponseResults, MdBlock, NotionToMarkdownOptions, CustomTransformer } from "./types";
2
2
  /**
3
3
  * Converts a Notion page to Markdown.
4
4
  */
5
5
  export declare class NotionToMarkdown {
6
6
  private notionClient;
7
+ private customTransformers;
7
8
  constructor(options: NotionToMarkdownOptions);
9
+ setCustomTransformer(type: string, transformer: CustomTransformer): NotionToMarkdown;
8
10
  /**
9
11
  * Converts Markdown Blocks to string
10
12
  * @param {MdBlock[]} mdBlocks - Array of markdown blocks
@@ -1 +1 @@
1
- {"version":3,"file":"notion-to-md.d.ts","sourceRoot":"","sources":["../src/notion-to-md.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,+BAA+B,EAC/B,gCAAgC,EAChC,OAAO,EAEP,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,EAAE,uBAAuB;IAI5C;;;;;OAKG;IACH,gBAAgB,CAAC,QAAQ,GAAE,OAAO,EAAO,EAAE,YAAY,GAAE,MAAU,GAAG,MAAM;IAe5E;;;;;OAKG;IACG,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,MAAM,GAAG,IAAW,GAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;IAarB;;;;;;OAMG;IACG,gBAAgB,CACpB,MAAM,CAAC,EAAE,gCAAgC,EACzC,SAAS,GAAE,MAAM,GAAG,IAAW,EAC/B,QAAQ,GAAE,OAAO,EAAO,GACvB,OAAO,CAAC,OAAO,EAAE,CAAC;IA0CrB;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,+BAA+B;IAwR5D;;;;;OAKG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM;CAsBlE"}
1
+ {"version":3,"file":"notion-to-md.d.ts","sourceRoot":"","sources":["../src/notion-to-md.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,+BAA+B,EAC/B,gCAAgC,EAChC,OAAO,EAEP,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,kBAAkB,CAAmC;gBACjD,OAAO,EAAE,uBAAuB;IAI5C,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,gBAAgB;IAKpF;;;;;OAKG;IACH,gBAAgB,CAAC,QAAQ,GAAE,OAAO,EAAO,EAAE,YAAY,GAAE,MAAU,GAAG,MAAM;IAe5E;;;;;OAKG;IACG,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,MAAM,GAAG,IAAW,GAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;IAarB;;;;;;OAMG;IACG,gBAAgB,CACpB,MAAM,CAAC,EAAE,gCAAgC,EACzC,SAAS,GAAE,MAAM,GAAG,IAAW,EAC/B,QAAQ,GAAE,OAAO,EAAO,GACvB,OAAO,CAAC,OAAO,EAAE,CAAC;IA0CrB;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,+BAA+B;IAwR5D;;;;;OAKG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM;CAsBlE"}
@@ -32,6 +32,11 @@ const notion_1 = require("./utils/notion");
32
32
  class NotionToMarkdown {
33
33
  constructor(options) {
34
34
  this.notionClient = options.notionClient;
35
+ this.customTransformers = {};
36
+ }
37
+ setCustomTransformer(type, transformer) {
38
+ this.customTransformers[type] = transformer;
39
+ return this;
35
40
  }
36
41
  /**
37
42
  * Converts Markdown Blocks to string
@@ -106,11 +111,13 @@ ${md.addTabSpace(mdBlocks.parent, nestingLevel)}
106
111
  * @returns {string} corresponding markdown string of the passed block
107
112
  */
108
113
  async blockToMarkdown(block) {
109
- if (!("type" in block))
114
+ var _a;
115
+ if (typeof block !== "object" || !("type" in block))
110
116
  return "";
111
117
  let parsedData = "";
112
118
  const { type } = block;
113
- // console.log({ block });
119
+ if (type in this.customTransformers && !!this.customTransformers[type])
120
+ return await this.customTransformers[type](block);
114
121
  switch (type) {
115
122
  case "image":
116
123
  {
@@ -229,7 +236,7 @@ ${md.addTabSpace(mdBlocks.parent, nestingLevel)}
229
236
  }
230
237
  case "toggle": {
231
238
  const { id, has_children } = block;
232
- const toggle_summary = block.toggle.rich_text[0].plain_text;
239
+ const toggle_summary = (_a = block.toggle.rich_text[0]) === null || _a === void 0 ? void 0 : _a.plain_text;
233
240
  // empty toggle
234
241
  if (!has_children) {
235
242
  return md.toggle(toggle_summary);
@@ -1 +1 @@
1
- {"version":3,"file":"notion-to-md.js","sourceRoot":"","sources":["../src/notion-to-md.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client } from \"@notionhq/client\";\r\nimport {\r\n Annotations,\r\n ListBlockChildrenResponseResult,\r\n ListBlockChildrenResponseResults,\r\n MdBlock,\r\n Text,\r\n NotionToMarkdownOptions,\r\n} from \"./types\";\r\nimport * as md from \"./utils/md\";\r\nimport { getBlockChildren } from \"./utils/notion\";\r\n\r\n/**\r\n * Converts a Notion page to Markdown.\r\n */\r\nexport class NotionToMarkdown {\r\n private notionClient: Client;\r\n\r\n constructor(options: NotionToMarkdownOptions) {\r\n this.notionClient = options.notionClient;\r\n }\r\n\r\n /**\r\n * Converts Markdown Blocks to string\r\n * @param {MdBlock[]} mdBlocks - Array of markdown blocks\r\n * @param {number} nestingLevel - Defines max depth of nesting\r\n * @returns {string} - Returns markdown string\r\n */\r\n toMarkdownString(mdBlocks: MdBlock[] = [], nestingLevel: number = 0): string {\r\n let mdString = \"\";\r\n mdBlocks.forEach((mdBlocks) => {\r\n if (mdBlocks.parent) {\r\n mdString += `\r\n${md.addTabSpace(mdBlocks.parent, nestingLevel)}\r\n`;\r\n }\r\n if (mdBlocks.children && mdBlocks.children.length > 0) {\r\n mdString += this.toMarkdownString(mdBlocks.children, nestingLevel + 1);\r\n }\r\n });\r\n return mdString;\r\n }\r\n\r\n /**\r\n * Retrieves Notion Blocks based on ID and converts them to Markdown Blocks\r\n * @param {string} id - notion page id (not database id)\r\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100 (Default=null)\r\n * @returns {Promise<MdBlock[]>} - List of markdown blocks\r\n */\r\n async pageToMarkdown(\r\n id: string,\r\n totalPage: number | null = null\r\n ): Promise<MdBlock[]> {\r\n if (!this.notionClient) {\r\n throw new Error(\r\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\r\n );\r\n }\r\n\r\n const blocks = await getBlockChildren(this.notionClient, id, totalPage);\r\n\r\n const parsedData = await this.blocksToMarkdown(blocks);\r\n return parsedData;\r\n }\r\n\r\n /**\r\n * Converts list of Notion Blocks to Markdown Blocks\r\n * @param {ListBlockChildrenResponseResults | undefined} blocks - List of notion blocks\r\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100\r\n * @param {MdBlock[]} mdBlocks - Defines max depth of nesting\r\n * @returns {Promise<MdBlock[]>} - Array of markdown blocks with their children\r\n */\r\n async blocksToMarkdown(\r\n blocks?: ListBlockChildrenResponseResults,\r\n totalPage: number | null = null,\r\n mdBlocks: MdBlock[] = []\r\n ): Promise<MdBlock[]> {\r\n if (!this.notionClient) {\r\n throw new Error(\r\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\r\n );\r\n }\r\n\r\n if (!blocks) return mdBlocks;\r\n\r\n for (let i = 0; i < blocks.length; i++) {\r\n let block = blocks[i];\r\n if (\r\n \"has_children\" in block &&\r\n block.has_children &&\r\n block.type !== \"column_list\" &&\r\n block.type !== \"toggle\"\r\n ) {\r\n let child_blocks = await getBlockChildren(\r\n this.notionClient,\r\n block.id,\r\n totalPage\r\n );\r\n mdBlocks.push({\r\n parent: await this.blockToMarkdown(block),\r\n children: [],\r\n });\r\n\r\n let l = mdBlocks.length;\r\n await this.blocksToMarkdown(\r\n child_blocks,\r\n totalPage,\r\n mdBlocks[l - 1].children\r\n );\r\n continue;\r\n }\r\n let tmp = await this.blockToMarkdown(block);\r\n\r\n mdBlocks.push({ parent: tmp, children: [] });\r\n }\r\n return mdBlocks;\r\n }\r\n\r\n /**\r\n * Converts a Notion Block to a Markdown Block\r\n * @param {ListBlockChildrenResponseResult} block - single notion block\r\n * @returns {string} corresponding markdown string of the passed block\r\n */\r\n async blockToMarkdown(block: ListBlockChildrenResponseResult) {\r\n if (!(\"type\" in block)) return \"\";\r\n\r\n let parsedData = \"\";\r\n const { type } = block;\r\n // console.log({ block });\r\n\r\n switch (type) {\r\n case \"image\":\r\n {\r\n let blockContent = block.image;\r\n const image_caption_plain = blockContent.caption\r\n .map((item) => item.plain_text)\r\n .join(\"\");\r\n const image_type = blockContent.type;\r\n if (image_type === \"external\")\r\n return md.image(image_caption_plain, blockContent.external.url);\r\n if (image_type === \"file\")\r\n return md.image(image_caption_plain, blockContent.file.url);\r\n }\r\n break;\r\n\r\n case \"divider\": {\r\n return md.divider();\r\n }\r\n\r\n case \"equation\": {\r\n return md.codeBlock(block.equation.expression);\r\n }\r\n\r\n case \"video\":\r\n case \"file\":\r\n case \"pdf\":\r\n {\r\n let blockContent;\r\n if (type === \"video\") blockContent = block.video;\r\n if (type === \"file\") blockContent = block.file;\r\n if (type === \"pdf\") blockContent = block.pdf;\r\n if (blockContent) {\r\n const file_type = blockContent.type;\r\n if (file_type === \"external\")\r\n return md.link(\"image\", blockContent.external.url);\r\n if (file_type === \"file\")\r\n return md.link(\"image\", blockContent.file.url);\r\n }\r\n }\r\n break;\r\n\r\n case \"bookmark\":\r\n case \"embed\":\r\n case \"link_preview\":\r\n case \"link_to_page\":\r\n case \"child_page\":\r\n case \"child_database\":\r\n {\r\n let blockContent;\r\n let title: string = type;\r\n if (type === \"bookmark\") blockContent = block.bookmark;\r\n if (type === \"embed\") blockContent = block.embed;\r\n if (type === \"link_preview\") blockContent = block.link_preview;\r\n if (\r\n type === \"link_to_page\" &&\r\n block.link_to_page.type === \"page_id\"\r\n ) {\r\n blockContent = { url: block.link_to_page.page_id };\r\n }\r\n\r\n if (type === \"child_page\") {\r\n blockContent = { url: block.id };\r\n title = block.child_page.title;\r\n }\r\n\r\n if (type === \"child_database\") {\r\n blockContent = { url: block.id };\r\n title = block.child_database.title || \"child_database\";\r\n }\r\n\r\n if (blockContent) return md.link(title, blockContent.url);\r\n }\r\n break;\r\n\r\n case \"table\": {\r\n const { id, has_children } = block;\r\n let tableArr: string[][] = [];\r\n if (has_children) {\r\n const tableRows = await getBlockChildren(this.notionClient, id, 100);\r\n // console.log(\">>\", tableRows);\r\n let rowsPromise = tableRows?.map(async (row) => {\r\n const { type } = row as any;\r\n const cells = (row as any)[type][\"cells\"];\r\n\r\n /**\r\n * this is more like a hack since matching the type text was\r\n * difficult. So converting each cell to paragraph type to\r\n * reuse the blockToMarkdown function\r\n */\r\n let cellStringPromise = cells.map(\r\n async (cell: any) =>\r\n await this.blockToMarkdown({\r\n type: \"paragraph\",\r\n paragraph: { rich_text: cell },\r\n } as ListBlockChildrenResponseResult)\r\n );\r\n\r\n const cellStringArr = await Promise.all(cellStringPromise);\r\n // console.log(\"~~\", cellStringArr);\r\n tableArr.push(cellStringArr);\r\n // console.log(tableArr);\r\n });\r\n await Promise.all(rowsPromise || []);\r\n }\r\n return md.table(tableArr);\r\n }\r\n\r\n case \"column_list\": {\r\n const { id, has_children } = block;\r\n\r\n if (!has_children) return \"\";\r\n\r\n const column_list_children = await getBlockChildren(\r\n this.notionClient,\r\n id,\r\n 100\r\n );\r\n\r\n let column_list_promise = column_list_children.map(\r\n async (column) => await this.blockToMarkdown(column)\r\n );\r\n\r\n let column_list: string[] = await Promise.all(column_list_promise);\r\n\r\n return column_list.join(\"\\n\\n\");\r\n }\r\n\r\n case \"column\": {\r\n const { id, has_children } = block;\r\n if (!has_children) return \"\";\r\n\r\n const column_children = await getBlockChildren(\r\n this.notionClient,\r\n id,\r\n 100\r\n );\r\n\r\n const column_children_promise = column_children.map(\r\n async (column_child) => await this.blockToMarkdown(column_child)\r\n );\r\n\r\n let column: string[] = await Promise.all(column_children_promise);\r\n return column.join(\"\\n\\n\");\r\n }\r\n\r\n case \"toggle\": {\r\n const { id, has_children } = block;\r\n\r\n const toggle_summary = block.toggle.rich_text[0].plain_text;\r\n\r\n // empty toggle\r\n if (!has_children) {\r\n return md.toggle(toggle_summary);\r\n }\r\n\r\n const toggle_children_object = await getBlockChildren(\r\n this.notionClient,\r\n id,\r\n 100\r\n );\r\n\r\n // parse children blocks to md object\r\n const toggle_children = await this.blocksToMarkdown(\r\n toggle_children_object\r\n );\r\n\r\n // convert children md object to md string\r\n const toggle_children_md_string =\r\n this.toMarkdownString(toggle_children);\r\n\r\n return md.toggle(toggle_summary, toggle_children_md_string);\r\n }\r\n // Rest of the types\r\n // \"paragraph\"\r\n // \"heading_1\"\r\n // \"heading_2\"\r\n // \"heading_3\"\r\n // \"bulleted_list_item\"\r\n // \"numbered_list_item\"\r\n // \"quote\"\r\n // \"to_do\"\r\n // \"template\"\r\n // \"synced_block\"\r\n // \"child_page\"\r\n // \"child_database\"\r\n // \"code\"\r\n // \"callout\"\r\n // \"breadcrumb\"\r\n // \"table_of_contents\"\r\n // \"column_list\"\r\n // \"column\"\r\n // \"link_to_page\"\r\n // \"audio\"\r\n // \"unsupported\"\r\n\r\n default: {\r\n // In this case typescript is not able to index the types properly, hence ignoring the error\r\n\r\n // @ts-ignore\r\n let blockContent = block[type].text || block[type].rich_text || [];\r\n blockContent.map((content: Text) => {\r\n const annotations = content.annotations;\r\n let plain_text = content.plain_text;\r\n\r\n plain_text = this.annotatePlainText(plain_text, annotations);\r\n\r\n if (content[\"href\"])\r\n plain_text = md.link(plain_text, content[\"href\"]);\r\n\r\n parsedData += plain_text;\r\n });\r\n }\r\n }\r\n\r\n switch (type) {\r\n case \"code\":\r\n {\r\n parsedData = md.codeBlock(parsedData, block[type].language);\r\n }\r\n break;\r\n\r\n case \"heading_1\":\r\n {\r\n parsedData = md.heading1(parsedData);\r\n }\r\n break;\r\n\r\n case \"heading_2\":\r\n {\r\n parsedData = md.heading2(parsedData);\r\n }\r\n break;\r\n\r\n case \"heading_3\":\r\n {\r\n parsedData = md.heading3(parsedData);\r\n }\r\n break;\r\n\r\n case \"quote\":\r\n {\r\n parsedData = md.quote(parsedData);\r\n }\r\n break;\r\n\r\n case \"callout\":\r\n {\r\n parsedData = md.callout(parsedData, block[type].icon);\r\n }\r\n break;\r\n\r\n case \"bulleted_list_item\":\r\n {\r\n parsedData = md.bullet(parsedData);\r\n }\r\n break;\r\n\r\n case \"numbered_list_item\":\r\n {\r\n parsedData = md.bullet(parsedData, block.numbered_list_item.number);\r\n }\r\n break;\r\n\r\n case \"to_do\":\r\n {\r\n parsedData = md.todo(parsedData, block.to_do.checked);\r\n }\r\n break;\r\n }\r\n\r\n return parsedData;\r\n }\r\n\r\n /**\r\n * Annoate text using provided annotations\r\n * @param {string} text - String to be annotated\r\n * @param {Annotations} annotations - Annotation object of a notion block\r\n * @returns {string} - Annotated text\r\n */\r\n annotatePlainText(text: string, annotations: Annotations): string {\r\n // if text is all spaces, don't annotate\r\n if (text.match(/^\\s*$/)) return text;\r\n\r\n const leadingSpaceMatch = text.match(/^(\\s*)/);\r\n const trailingSpaceMatch = text.match(/(\\s*)$/);\r\n\r\n const leading_space = leadingSpaceMatch ? leadingSpaceMatch[0] : \"\";\r\n const trailing_space = trailingSpaceMatch ? trailingSpaceMatch[0] : \"\";\r\n\r\n text = text.trim();\r\n\r\n if (text !== \"\") {\r\n if (annotations.code) text = md.inlineCode(text);\r\n if (annotations.bold) text = md.bold(text);\r\n if (annotations.italic) text = md.italic(text);\r\n if (annotations.strikethrough) text = md.strikethrough(text);\r\n if (annotations.underline) text = md.underline(text);\r\n }\r\n\r\n return leading_space + text + trailing_space;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"notion-to-md.js","sourceRoot":"","sources":["../src/notion-to-md.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client } from \"@notionhq/client\";\r\nimport {\r\n Annotations,\r\n ListBlockChildrenResponseResult,\r\n ListBlockChildrenResponseResults,\r\n MdBlock,\r\n Text,\r\n NotionToMarkdownOptions,\r\n CustomTransformer\r\n} from \"./types\";\r\nimport * as md from \"./utils/md\";\r\nimport { getBlockChildren } from \"./utils/notion\";\r\n\r\n/**\r\n * Converts a Notion page to Markdown.\r\n */\r\nexport class NotionToMarkdown {\r\n private notionClient: Client;\r\n private customTransformers: Record<string, CustomTransformer>\r\n constructor(options: NotionToMarkdownOptions) {\r\n this.notionClient = options.notionClient;\r\n this.customTransformers = {}\r\n }\r\n setCustomTransformer(type: string, transformer: CustomTransformer): NotionToMarkdown {\r\n this.customTransformers[type] = transformer;\r\n\r\n return this;\r\n }\r\n /**\r\n * Converts Markdown Blocks to string\r\n * @param {MdBlock[]} mdBlocks - Array of markdown blocks\r\n * @param {number} nestingLevel - Defines max depth of nesting\r\n * @returns {string} - Returns markdown string\r\n */\r\n toMarkdownString(mdBlocks: MdBlock[] = [], nestingLevel: number = 0): string {\r\n let mdString = \"\";\r\n mdBlocks.forEach((mdBlocks) => {\r\n if (mdBlocks.parent) {\r\n mdString += `\r\n${md.addTabSpace(mdBlocks.parent, nestingLevel)}\r\n`;\r\n }\r\n if (mdBlocks.children && mdBlocks.children.length > 0) {\r\n mdString += this.toMarkdownString(mdBlocks.children, nestingLevel + 1);\r\n }\r\n });\r\n return mdString;\r\n }\r\n\r\n /**\r\n * Retrieves Notion Blocks based on ID and converts them to Markdown Blocks\r\n * @param {string} id - notion page id (not database id)\r\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100 (Default=null)\r\n * @returns {Promise<MdBlock[]>} - List of markdown blocks\r\n */\r\n async pageToMarkdown(\r\n id: string,\r\n totalPage: number | null = null\r\n ): Promise<MdBlock[]> {\r\n if (!this.notionClient) {\r\n throw new Error(\r\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\r\n );\r\n }\r\n\r\n const blocks = await getBlockChildren(this.notionClient, id, totalPage);\r\n\r\n const parsedData = await this.blocksToMarkdown(blocks);\r\n return parsedData;\r\n }\r\n\r\n /**\r\n * Converts list of Notion Blocks to Markdown Blocks\r\n * @param {ListBlockChildrenResponseResults | undefined} blocks - List of notion blocks\r\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100\r\n * @param {MdBlock[]} mdBlocks - Defines max depth of nesting\r\n * @returns {Promise<MdBlock[]>} - Array of markdown blocks with their children\r\n */\r\n async blocksToMarkdown(\r\n blocks?: ListBlockChildrenResponseResults,\r\n totalPage: number | null = null,\r\n mdBlocks: MdBlock[] = []\r\n ): Promise<MdBlock[]> {\r\n if (!this.notionClient) {\r\n throw new Error(\r\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\r\n );\r\n }\r\n\r\n if (!blocks) return mdBlocks;\r\n\r\n for (let i = 0; i < blocks.length; i++) {\r\n let block = blocks[i];\r\n if (\r\n \"has_children\" in block &&\r\n block.has_children &&\r\n block.type !== \"column_list\" &&\r\n block.type !== \"toggle\"\r\n ) {\r\n let child_blocks = await getBlockChildren(\r\n this.notionClient,\r\n block.id,\r\n totalPage\r\n );\r\n mdBlocks.push({\r\n parent: await this.blockToMarkdown(block),\r\n children: [],\r\n });\r\n\r\n let l = mdBlocks.length;\r\n await this.blocksToMarkdown(\r\n child_blocks,\r\n totalPage,\r\n mdBlocks[l - 1].children\r\n );\r\n continue;\r\n }\r\n let tmp = await this.blockToMarkdown(block);\r\n\r\n mdBlocks.push({ parent: tmp, children: [] });\r\n }\r\n return mdBlocks;\r\n }\r\n\r\n /**\r\n * Converts a Notion Block to a Markdown Block\r\n * @param {ListBlockChildrenResponseResult} block - single notion block\r\n * @returns {string} corresponding markdown string of the passed block\r\n */\r\n async blockToMarkdown(block: ListBlockChildrenResponseResult) {\r\n if (typeof block !== \"object\" || !(\"type\" in block)) return \"\";\r\n\r\n let parsedData = \"\";\r\n const { type } = block;\r\n if(type in this.customTransformers && !!this.customTransformers[type]) \r\n return await this.customTransformers[type](block);\r\n \r\n switch (type) {\r\n case \"image\":\r\n {\r\n let blockContent = block.image;\r\n const image_caption_plain = blockContent.caption\r\n .map((item) => item.plain_text)\r\n .join(\"\");\r\n const image_type = blockContent.type;\r\n if (image_type === \"external\")\r\n return md.image(image_caption_plain, blockContent.external.url);\r\n if (image_type === \"file\")\r\n return md.image(image_caption_plain, blockContent.file.url);\r\n }\r\n break;\r\n\r\n case \"divider\": {\r\n return md.divider();\r\n }\r\n\r\n case \"equation\": {\r\n return md.codeBlock(block.equation.expression);\r\n }\r\n\r\n case \"video\":\r\n case \"file\":\r\n case \"pdf\":\r\n {\r\n let blockContent;\r\n if (type === \"video\") blockContent = block.video;\r\n if (type === \"file\") blockContent = block.file;\r\n if (type === \"pdf\") blockContent = block.pdf;\r\n if (blockContent) {\r\n const file_type = blockContent.type;\r\n if (file_type === \"external\")\r\n return md.link(\"image\", blockContent.external.url);\r\n if (file_type === \"file\")\r\n return md.link(\"image\", blockContent.file.url);\r\n }\r\n }\r\n break;\r\n\r\n case \"bookmark\":\r\n case \"embed\":\r\n case \"link_preview\":\r\n case \"link_to_page\":\r\n case \"child_page\":\r\n case \"child_database\":\r\n {\r\n let blockContent;\r\n let title: string = type;\r\n if (type === \"bookmark\") blockContent = block.bookmark;\r\n if (type === \"embed\") blockContent = block.embed;\r\n if (type === \"link_preview\") blockContent = block.link_preview;\r\n if (\r\n type === \"link_to_page\" &&\r\n block.link_to_page.type === \"page_id\"\r\n ) {\r\n blockContent = { url: block.link_to_page.page_id };\r\n }\r\n\r\n if (type === \"child_page\") {\r\n blockContent = { url: block.id };\r\n title = block.child_page.title;\r\n }\r\n\r\n if (type === \"child_database\") {\r\n blockContent = { url: block.id };\r\n title = block.child_database.title || \"child_database\";\r\n }\r\n\r\n if (blockContent) return md.link(title, blockContent.url);\r\n }\r\n break;\r\n\r\n case \"table\": {\r\n const { id, has_children } = block;\r\n let tableArr: string[][] = [];\r\n if (has_children) {\r\n const tableRows = await getBlockChildren(this.notionClient, id, 100);\r\n // console.log(\">>\", tableRows);\r\n let rowsPromise = tableRows?.map(async (row) => {\r\n const { type } = row as any;\r\n const cells = (row as any)[type][\"cells\"];\r\n\r\n /**\r\n * this is more like a hack since matching the type text was\r\n * difficult. So converting each cell to paragraph type to\r\n * reuse the blockToMarkdown function\r\n */\r\n let cellStringPromise = cells.map(\r\n async (cell: any) =>\r\n await this.blockToMarkdown({\r\n type: \"paragraph\",\r\n paragraph: { rich_text: cell },\r\n } as ListBlockChildrenResponseResult)\r\n );\r\n\r\n const cellStringArr = await Promise.all(cellStringPromise);\r\n // console.log(\"~~\", cellStringArr);\r\n tableArr.push(cellStringArr);\r\n // console.log(tableArr);\r\n });\r\n await Promise.all(rowsPromise || []);\r\n }\r\n return md.table(tableArr);\r\n }\r\n\r\n case \"column_list\": {\r\n const { id, has_children } = block;\r\n\r\n if (!has_children) return \"\";\r\n\r\n const column_list_children = await getBlockChildren(\r\n this.notionClient,\r\n id,\r\n 100\r\n );\r\n\r\n let column_list_promise = column_list_children.map(\r\n async (column) => await this.blockToMarkdown(column)\r\n );\r\n\r\n let column_list: string[] = await Promise.all(column_list_promise);\r\n\r\n return column_list.join(\"\\n\\n\");\r\n }\r\n\r\n case \"column\": {\r\n const { id, has_children } = block;\r\n if (!has_children) return \"\";\r\n\r\n const column_children = await getBlockChildren(\r\n this.notionClient,\r\n id,\r\n 100\r\n );\r\n\r\n const column_children_promise = column_children.map(\r\n async (column_child) => await this.blockToMarkdown(column_child)\r\n );\r\n\r\n let column: string[] = await Promise.all(column_children_promise);\r\n return column.join(\"\\n\\n\");\r\n }\r\n\r\n case \"toggle\": {\r\n const { id, has_children } = block;\r\n\r\n const toggle_summary = block.toggle.rich_text[0]?.plain_text;\r\n\r\n // empty toggle\r\n if (!has_children) {\r\n return md.toggle(toggle_summary);\r\n }\r\n\r\n const toggle_children_object = await getBlockChildren(\r\n this.notionClient,\r\n id,\r\n 100\r\n );\r\n\r\n // parse children blocks to md object\r\n const toggle_children = await this.blocksToMarkdown(\r\n toggle_children_object\r\n );\r\n\r\n // convert children md object to md string\r\n const toggle_children_md_string =\r\n this.toMarkdownString(toggle_children);\r\n\r\n return md.toggle(toggle_summary, toggle_children_md_string);\r\n }\r\n // Rest of the types\r\n // \"paragraph\"\r\n // \"heading_1\"\r\n // \"heading_2\"\r\n // \"heading_3\"\r\n // \"bulleted_list_item\"\r\n // \"numbered_list_item\"\r\n // \"quote\"\r\n // \"to_do\"\r\n // \"template\"\r\n // \"synced_block\"\r\n // \"child_page\"\r\n // \"child_database\"\r\n // \"code\"\r\n // \"callout\"\r\n // \"breadcrumb\"\r\n // \"table_of_contents\"\r\n // \"column_list\"\r\n // \"column\"\r\n // \"link_to_page\"\r\n // \"audio\"\r\n // \"unsupported\"\r\n\r\n default: {\r\n // In this case typescript is not able to index the types properly, hence ignoring the error\r\n // @ts-ignore\r\n let blockContent = block[type].text || block[type].rich_text || [];\r\n blockContent.map((content: Text) => {\r\n const annotations = content.annotations;\r\n let plain_text = content.plain_text;\r\n\r\n plain_text = this.annotatePlainText(plain_text, annotations);\r\n\r\n if (content[\"href\"])\r\n plain_text = md.link(plain_text, content[\"href\"]);\r\n\r\n parsedData += plain_text;\r\n });\r\n }\r\n }\r\n\r\n switch (type) {\r\n case \"code\":\r\n {\r\n parsedData = md.codeBlock(parsedData, block[type].language);\r\n }\r\n break;\r\n\r\n case \"heading_1\":\r\n {\r\n parsedData = md.heading1(parsedData);\r\n }\r\n break;\r\n\r\n case \"heading_2\":\r\n {\r\n parsedData = md.heading2(parsedData);\r\n }\r\n break;\r\n\r\n case \"heading_3\":\r\n {\r\n parsedData = md.heading3(parsedData);\r\n }\r\n break;\r\n\r\n case \"quote\":\r\n {\r\n parsedData = md.quote(parsedData);\r\n }\r\n break;\r\n\r\n case \"callout\":\r\n {\r\n parsedData = md.callout(parsedData, block[type].icon);\r\n }\r\n break;\r\n\r\n case \"bulleted_list_item\":\r\n {\r\n parsedData = md.bullet(parsedData);\r\n }\r\n break;\r\n\r\n case \"numbered_list_item\":\r\n {\r\n parsedData = md.bullet(parsedData, block.numbered_list_item.number);\r\n }\r\n break;\r\n\r\n case \"to_do\":\r\n {\r\n parsedData = md.todo(parsedData, block.to_do.checked);\r\n }\r\n break;\r\n }\r\n\r\n return parsedData;\r\n }\r\n\r\n /**\r\n * Annoate text using provided annotations\r\n * @param {string} text - String to be annotated\r\n * @param {Annotations} annotations - Annotation object of a notion block\r\n * @returns {string} - Annotated text\r\n */\r\n annotatePlainText(text: string, annotations: Annotations): string {\r\n // if text is all spaces, don't annotate\r\n if (text.match(/^\\s*$/)) return text;\r\n\r\n const leadingSpaceMatch = text.match(/^(\\s*)/);\r\n const trailingSpaceMatch = text.match(/(\\s*)$/);\r\n\r\n const leading_space = leadingSpaceMatch ? leadingSpaceMatch[0] : \"\";\r\n const trailing_space = trailingSpaceMatch ? trailingSpaceMatch[0] : \"\";\r\n\r\n text = text.trim();\r\n\r\n if (text !== \"\") {\r\n if (annotations.code) text = md.inlineCode(text);\r\n if (annotations.bold) text = md.bold(text);\r\n if (annotations.italic) text = md.italic(text);\r\n if (annotations.strikethrough) text = md.strikethrough(text);\r\n if (annotations.underline) text = md.underline(text);\r\n }\r\n\r\n return leading_space + text + trailing_space;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=notion-to-md.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion-to-md.spec.d.ts","sourceRoot":"","sources":["../src/notion-to-md.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const notion_to_md_1 = require("./notion-to-md");
4
+ describe("setCustomTransformer", () => {
5
+ test("blockToMarkdown sends parsing block to customTransformer", () => {
6
+ const customTransformerMock = jest.fn();
7
+ const n2m = new notion_to_md_1.NotionToMarkdown({ notionClient: {} });
8
+ n2m.setCustomTransformer("test", customTransformerMock);
9
+ n2m.blockToMarkdown({
10
+ id: "test", name: "test", type: "test", test: { "foo": "bar" }
11
+ });
12
+ expect(customTransformerMock).toHaveBeenCalledWith(expect.objectContaining({
13
+ type: "test", test: { "foo": "bar" }
14
+ }));
15
+ });
16
+ test("supports only one customTransformer per type ", () => {
17
+ const customTransformerMock1 = jest.fn();
18
+ const customTransformerMock2 = jest.fn();
19
+ const n2m = new notion_to_md_1.NotionToMarkdown({ notionClient: {} });
20
+ n2m.setCustomTransformer("test", customTransformerMock1);
21
+ n2m.setCustomTransformer("test", customTransformerMock2);
22
+ n2m.blockToMarkdown({
23
+ id: "test", name: "test", type: "test", test: { "foo": "bar" }
24
+ });
25
+ expect(customTransformerMock1).not.toHaveBeenCalled();
26
+ expect(customTransformerMock2).toHaveBeenCalled();
27
+ });
28
+ });
29
+ //# sourceMappingURL=notion-to-md.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion-to-md.spec.js","sourceRoot":"","sources":["../src/notion-to-md.spec.ts"],"names":[],"mappings":";;AAAA,iDAAmD;AAEnD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAEpC,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACpE,MAAM,qBAAqB,GAAE,IAAI,CAAC,EAAE,EAAE,CAAA;QACtC,MAAM,GAAG,GAAG,IAAI,+BAAgB,CAAC,EAAC,YAAY,EAAE,EAAS,EAAC,CAAC,CAAA;QAC3D,GAAG,CAAC,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;QACvD,GAAG,CAAC,eAAe,CAAC;YAClB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC;SACtD,CAAC,CAAA;QACT,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC;YACzE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC;SACnC,CAAC,CAAC,CAAA;IACL,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,MAAM,sBAAsB,GAAE,IAAI,CAAC,EAAE,EAAE,CAAA;QACvC,MAAM,sBAAsB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;QACxC,MAAM,GAAG,GAAG,IAAI,+BAAgB,CAAC,EAAC,YAAY,EAAE,EAAS,EAAC,CAAC,CAAA;QAC3D,GAAG,CAAC,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;QACxD,GAAG,CAAC,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;QACxD,GAAG,CAAC,eAAe,CAAC;YAClB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC;SACtD,CAAC,CAAA;QACT,MAAM,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACrD,MAAM,CAAC,sBAAsB,CAAC,CAAC,gBAAgB,EAAE,CAAA;IACnD,CAAC,CAAC,CAAA;AAGJ,CAAC,CAAC,CAAA","sourcesContent":["import { NotionToMarkdown } from './notion-to-md';\r\n\r\ndescribe(\"setCustomTransformer\", () => {\r\n\r\n test(\"blockToMarkdown sends parsing block to customTransformer\", () => {\r\n const customTransformerMock =jest.fn()\r\n const n2m = new NotionToMarkdown({notionClient: {} as any})\r\n n2m.setCustomTransformer(\"test\", customTransformerMock)\r\n n2m.blockToMarkdown({\r\n id: \"test\", name: \"test\", type: \"test\", test: {\"foo\": \"bar\"}\r\n } as any)\r\n expect(customTransformerMock).toHaveBeenCalledWith(expect.objectContaining({\r\n type: \"test\", test: {\"foo\": \"bar\"}\r\n }))\r\n })\r\n test(\"supports only one customTransformer per type \", () => {\r\n const customTransformerMock1 =jest.fn()\r\n const customTransformerMock2 = jest.fn()\r\n const n2m = new NotionToMarkdown({notionClient: {} as any})\r\n n2m.setCustomTransformer(\"test\", customTransformerMock1)\r\n n2m.setCustomTransformer(\"test\", customTransformerMock2)\r\n n2m.blockToMarkdown({\r\n id: \"test\", name: \"test\", type: \"test\", test: {\"foo\": \"bar\"}\r\n } as any)\r\n expect(customTransformerMock1).not.toHaveBeenCalled()\r\n expect(customTransformerMock2).toHaveBeenCalled()\r\n })\r\n\r\n\r\n})"]}
@@ -50,4 +50,5 @@ export declare type CalloutIcon = {
50
50
  expiry_time: string;
51
51
  };
52
52
  } | null;
53
+ export declare type CustomTransformer = (block: ListBlockChildrenResponseResult) => Promise<string>;
53
54
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,oBAAY,eAAe,GAAG;IAC5B,kBAAkB,CAAC,EAAE;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,oBAAY,gCAAgC,GAC1C,yBAAyB,CAAC,SAAS,CAAC,GAAG,eAAe,CAAC;AAEzD,oBAAY,+BAA+B,GACzC,gCAAgC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;AAExD,oBAAY,WAAW,GAAG,MAAM,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oBAAY,OAAO,GAAG;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,oBAAY,WAAW,GAAG;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EACD,SAAS,GACT,MAAM,GACN,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,MAAM,GACN,QAAQ,GACR,MAAM,GACN,KAAK,GACL,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,CAAC;CACtB,CAAC;AAEF,oBAAY,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE;YACJ,GAAG,EAAE,WAAW,CAAC;SAClB,GAAG,IAAI,CAAC;KACV,CAAC;IACF,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,oBAAY,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC5D,IAAI,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,oBAAY,eAAe,GAAG;IAC5B,kBAAkB,CAAC,EAAE;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AACF,oBAAY,gCAAgC,GAC1C,yBAAyB,CAAC,SAAS,CAAC,GAAG,eAAe,CAAC;AAEzD,oBAAY,+BAA+B,GACzC,gCAAgC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;AAExD,oBAAY,WAAW,GAAG,MAAM,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oBAAY,OAAO,GAAG;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,oBAAY,WAAW,GAAG;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EACD,SAAS,GACT,MAAM,GACN,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,MAAM,GACN,QAAQ,GACR,MAAM,GACN,KAAK,GACL,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,CAAC;CACtB,CAAC;AAEF,oBAAY,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE;YACJ,GAAG,EAAE,WAAW,CAAC;SAClB,GAAG,IAAI,CAAC;KACV,CAAC;IACF,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,oBAAY,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC5D,IAAI,CAAC;AACT,oBAAY,iBAAiB,GAAG,CAAC,KAAK,EAAE,+BAA+B,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { ListBlockChildrenResponse } from \"@notionhq/client/build/src/api-endpoints\";\r\nimport { Client } from \"@notionhq/client\";\r\n\r\nexport type BlockAttributes = {\r\n numbered_list_item?: {\r\n number?: number;\r\n };\r\n};\r\n\r\nexport type ListBlockChildrenResponseResults =\r\n ListBlockChildrenResponse[\"results\"] & BlockAttributes;\r\n\r\nexport type ListBlockChildrenResponseResult =\r\n ListBlockChildrenResponseResults[0] & BlockAttributes;\r\n\r\nexport type TextRequest = string;\r\n\r\nexport interface NotionToMarkdownOptions {\r\n notionClient: Client;\r\n}\r\n\r\nexport type MdBlock = {\r\n parent: string;\r\n children: MdBlock[];\r\n};\r\n\r\nexport type Annotations = {\r\n bold: boolean;\r\n italic: boolean;\r\n strikethrough: boolean;\r\n underline: boolean;\r\n code: boolean;\r\n color:\r\n | \"default\"\r\n | \"gray\"\r\n | \"brown\"\r\n | \"orange\"\r\n | \"yellow\"\r\n | \"green\"\r\n | \"blue\"\r\n | \"purple\"\r\n | \"pink\"\r\n | \"red\"\r\n | \"gray_background\"\r\n | \"brown_background\"\r\n | \"orange_background\"\r\n | \"yellow_background\"\r\n | \"green_background\"\r\n | \"blue_background\"\r\n | \"purple_background\"\r\n | \"pink_background\"\r\n | \"red_background\";\r\n};\r\n\r\nexport type Text = {\r\n type: \"text\";\r\n text: {\r\n content: string;\r\n link: {\r\n url: TextRequest;\r\n } | null;\r\n };\r\n annotations: Annotations;\r\n plain_text: string;\r\n href: string | null;\r\n};\r\n\r\nexport type CalloutIcon =\r\n | { type: \"emoji\"; emoji?: string }\r\n | { type: \"external\"; external?: { url: string } }\r\n | { type: \"file\"; file: { url: string; expiry_time: string } }\r\n | null;\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { ListBlockChildrenResponse } from \"@notionhq/client/build/src/api-endpoints\";\r\nimport { Client } from \"@notionhq/client\";\r\n\r\nexport type BlockAttributes = {\r\n numbered_list_item?: {\r\n number?: number;\r\n };\r\n};\r\nexport type ListBlockChildrenResponseResults =\r\n ListBlockChildrenResponse[\"results\"] & BlockAttributes;\r\n\r\nexport type ListBlockChildrenResponseResult =\r\n ListBlockChildrenResponseResults[0] & BlockAttributes;\r\n\r\nexport type TextRequest = string;\r\n\r\nexport interface NotionToMarkdownOptions {\r\n notionClient: Client;\r\n}\r\n\r\nexport type MdBlock = {\r\n parent: string;\r\n children: MdBlock[];\r\n};\r\n\r\nexport type Annotations = {\r\n bold: boolean;\r\n italic: boolean;\r\n strikethrough: boolean;\r\n underline: boolean;\r\n code: boolean;\r\n color:\r\n | \"default\"\r\n | \"gray\"\r\n | \"brown\"\r\n | \"orange\"\r\n | \"yellow\"\r\n | \"green\"\r\n | \"blue\"\r\n | \"purple\"\r\n | \"pink\"\r\n | \"red\"\r\n | \"gray_background\"\r\n | \"brown_background\"\r\n | \"orange_background\"\r\n | \"yellow_background\"\r\n | \"green_background\"\r\n | \"blue_background\"\r\n | \"purple_background\"\r\n | \"pink_background\"\r\n | \"red_background\";\r\n};\r\n\r\nexport type Text = {\r\n type: \"text\";\r\n text: {\r\n content: string;\r\n link: {\r\n url: TextRequest;\r\n } | null;\r\n };\r\n annotations: Annotations;\r\n plain_text: string;\r\n href: string | null;\r\n};\r\n\r\nexport type CalloutIcon =\r\n | { type: \"emoji\"; emoji?: string }\r\n | { type: \"external\"; external?: { url: string } }\r\n | { type: \"file\"; file: { url: string; expiry_time: string } }\r\n | null;\r\nexport type CustomTransformer = (block: ListBlockChildrenResponseResult) => Promise<string>;\r\n"]}
@@ -16,6 +16,6 @@ export declare const todo: (text: string, checked: boolean) => string;
16
16
  export declare const image: (alt: string, href: string) => string;
17
17
  export declare const addTabSpace: (text: string, n?: number) => string;
18
18
  export declare const divider: () => string;
19
- export declare const toggle: (summary: string, children?: string) => string;
19
+ export declare const toggle: (summary?: string, children?: string) => string;
20
20
  export declare const table: (cells: string[][]) => string;
21
21
  //# sourceMappingURL=md.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"md.d.ts","sourceRoot":"","sources":["../../src/utils/md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,eAAO,MAAM,UAAU,SAAU,MAAM,WAEtC,CAAC;AAEF,eAAO,MAAM,IAAI,SAAU,MAAM,WAEhC,CAAC;AAEF,eAAO,MAAM,MAAM,SAAU,MAAM,WAElC,CAAC;AAEF,eAAO,MAAM,aAAa,SAAU,MAAM,WAEzC,CAAC;AAEF,eAAO,MAAM,SAAS,SAAU,MAAM,WAErC,CAAC;AAEF,eAAO,MAAM,IAAI,SAAU,MAAM,QAAQ,MAAM,WAE9C,CAAC;AAEF,eAAO,MAAM,SAAS,SAAU,MAAM,aAAa,MAAM,WAIxD,CAAC;AAEF,eAAO,MAAM,QAAQ,SAAU,MAAM,WAEpC,CAAC;AAEF,eAAO,MAAM,QAAQ,SAAU,MAAM,WAEpC,CAAC;AAEF,eAAO,MAAM,QAAQ,SAAU,MAAM,WAEpC,CAAC;AAEF,eAAO,MAAM,KAAK,SAAU,MAAM,WAGjC,CAAC;AAEF,eAAO,MAAM,OAAO,SAAU,MAAM,SAAS,WAAW,WAQvD,CAAC;AAEF,eAAO,MAAM,MAAM,SAAU,MAAM,UAAU,MAAM,WAElD,CAAC;AAEF,eAAO,MAAM,IAAI,SAAU,MAAM,WAAW,OAAO,WAElD,CAAC;AAEF,eAAO,MAAM,KAAK,QAAS,MAAM,QAAQ,MAAM,WAE9C,CAAC;AAEF,eAAO,MAAM,WAAW,SAAU,MAAM,uBASvC,CAAC;AAEF,eAAO,MAAM,OAAO,cAEnB,CAAC;AAEF,eAAO,MAAM,MAAM,YAAa,MAAM,aAAa,MAAM,WAOxD,CAAC;AAEF,eAAO,MAAM,KAAK,UAAW,MAAM,EAAE,EAAE,WAEtC,CAAC"}
1
+ {"version":3,"file":"md.d.ts","sourceRoot":"","sources":["../../src/utils/md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,eAAO,MAAM,UAAU,SAAU,MAAM,WAEtC,CAAC;AAEF,eAAO,MAAM,IAAI,SAAU,MAAM,WAEhC,CAAC;AAEF,eAAO,MAAM,MAAM,SAAU,MAAM,WAElC,CAAC;AAEF,eAAO,MAAM,aAAa,SAAU,MAAM,WAEzC,CAAC;AAEF,eAAO,MAAM,SAAS,SAAU,MAAM,WAErC,CAAC;AAEF,eAAO,MAAM,IAAI,SAAU,MAAM,QAAQ,MAAM,WAE9C,CAAC;AAEF,eAAO,MAAM,SAAS,SAAU,MAAM,aAAa,MAAM,WAIxD,CAAC;AAEF,eAAO,MAAM,QAAQ,SAAU,MAAM,WAEpC,CAAC;AAEF,eAAO,MAAM,QAAQ,SAAU,MAAM,WAEpC,CAAC;AAEF,eAAO,MAAM,QAAQ,SAAU,MAAM,WAEpC,CAAC;AAEF,eAAO,MAAM,KAAK,SAAU,MAAM,WAGjC,CAAC;AAEF,eAAO,MAAM,OAAO,SAAU,MAAM,SAAS,WAAW,WAQvD,CAAC;AAEF,eAAO,MAAM,MAAM,SAAU,MAAM,UAAU,MAAM,WAElD,CAAC;AAEF,eAAO,MAAM,IAAI,SAAU,MAAM,WAAW,OAAO,WAElD,CAAC;AAEF,eAAO,MAAM,KAAK,QAAS,MAAM,QAAQ,MAAM,WAE9C,CAAC;AAEF,eAAO,MAAM,WAAW,SAAU,MAAM,uBASvC,CAAC;AAEF,eAAO,MAAM,OAAO,cAEnB,CAAC;AAEF,eAAO,MAAM,MAAM,aAAc,MAAM,aAAa,MAAM,WAQzD,CAAC;AAEF,eAAO,MAAM,KAAK,UAAW,MAAM,EAAE,EAAE,WAEtC,CAAC"}
package/build/utils/md.js CHANGED
@@ -91,6 +91,8 @@ const divider = () => {
91
91
  };
92
92
  exports.divider = divider;
93
93
  const toggle = (summary, children) => {
94
+ if (!summary)
95
+ return children || "";
94
96
  return `<details>
95
97
  <summary>${summary}</summary>
96
98
 
@@ -1 +1 @@
1
- {"version":3,"file":"md.js","sourceRoot":"","sources":["../../src/utils/md.ts"],"names":[],"mappings":"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","sourcesContent":["import { CalloutIcon } from \"../types\";\r\nimport markdownTable from \"markdown-table\";\r\n\r\nexport const inlineCode = (text: string) => {\r\n return `\\`${text}\\``;\r\n};\r\n\r\nexport const bold = (text: string) => {\r\n return `**${text}**`;\r\n};\r\n\r\nexport const italic = (text: string) => {\r\n return `_${text}_`;\r\n};\r\n\r\nexport const strikethrough = (text: string) => {\r\n return `~~${text}~~`;\r\n};\r\n\r\nexport const underline = (text: string) => {\r\n return `<u>${text}</u>`;\r\n};\r\n\r\nexport const link = (text: string, href: string) => {\r\n return `[${text}](${href})`;\r\n};\r\n\r\nexport const codeBlock = (text: string, language?: string) => {\r\n return `\\`\\`\\`${language}\r\n${text}\r\n\\`\\`\\``;\r\n};\r\n\r\nexport const heading1 = (text: string) => {\r\n return `# ${text}`;\r\n};\r\n\r\nexport const heading2 = (text: string) => {\r\n return `## ${text}`;\r\n};\r\n\r\nexport const heading3 = (text: string) => {\r\n return `### ${text}`;\r\n};\r\n\r\nexport const quote = (text: string) => {\r\n // the replace is done to handle multiple lines\r\n return `> ${text.replace(/\\n/g, \" \\n>\")}`;\r\n};\r\n\r\nexport const callout = (text: string, icon?: CalloutIcon) => {\r\n let emoji: string | undefined;\r\n if (icon?.type === \"emoji\") {\r\n emoji = icon.emoji;\r\n }\r\n\r\n // the replace is done to handle multiple lines\r\n return `> ${emoji ? emoji + \" \" : \"\"}${text.replace(/\\n/g, \" \\n>\")}`;\r\n};\r\n\r\nexport const bullet = (text: string, count?: number) => {\r\n return count ? `${count}. ${text}` : `- ${text}`;\r\n};\r\n\r\nexport const todo = (text: string, checked: boolean) => {\r\n return checked ? `- [x] ${text}` : `- [ ] ${text}`;\r\n};\r\n\r\nexport const image = (alt: string, href: string) => {\r\n return `![${alt}](${href})`;\r\n};\r\n\r\nexport const addTabSpace = (text: string, n = 0) => {\r\n const tab = \"\t\";\r\n for (let i = 0; i < n; i++) {\r\n if (text.includes(\"\\n\")) {\r\n const multiLineText = text.split(/(?<=\\n)/).join(tab);\r\n text = tab + multiLineText;\r\n } else text = tab + text;\r\n }\r\n return text;\r\n};\r\n\r\nexport const divider = () => {\r\n return \"---\";\r\n};\r\n\r\nexport const toggle = (summary: string, children?: string) => {\r\n return `<details>\r\n <summary>${summary}</summary>\r\n\r\n ${children || \"\"}\r\n\r\n </details>`;\r\n};\r\n\r\nexport const table = (cells: string[][]) => {\r\n return markdownTable(cells);\r\n};\r\n"]}
1
+ {"version":3,"file":"md.js","sourceRoot":"","sources":["../../src/utils/md.ts"],"names":[],"mappings":"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","sourcesContent":["import { CalloutIcon } from \"../types\";\r\nimport markdownTable from \"markdown-table\";\r\n\r\nexport const inlineCode = (text: string) => {\r\n return `\\`${text}\\``;\r\n};\r\n\r\nexport const bold = (text: string) => {\r\n return `**${text}**`;\r\n};\r\n\r\nexport const italic = (text: string) => {\r\n return `_${text}_`;\r\n};\r\n\r\nexport const strikethrough = (text: string) => {\r\n return `~~${text}~~`;\r\n};\r\n\r\nexport const underline = (text: string) => {\r\n return `<u>${text}</u>`;\r\n};\r\n\r\nexport const link = (text: string, href: string) => {\r\n return `[${text}](${href})`;\r\n};\r\n\r\nexport const codeBlock = (text: string, language?: string) => {\r\n return `\\`\\`\\`${language}\r\n${text}\r\n\\`\\`\\``;\r\n};\r\n\r\nexport const heading1 = (text: string) => {\r\n return `# ${text}`;\r\n};\r\n\r\nexport const heading2 = (text: string) => {\r\n return `## ${text}`;\r\n};\r\n\r\nexport const heading3 = (text: string) => {\r\n return `### ${text}`;\r\n};\r\n\r\nexport const quote = (text: string) => {\r\n // the replace is done to handle multiple lines\r\n return `> ${text.replace(/\\n/g, \" \\n>\")}`;\r\n};\r\n\r\nexport const callout = (text: string, icon?: CalloutIcon) => {\r\n let emoji: string | undefined;\r\n if (icon?.type === \"emoji\") {\r\n emoji = icon.emoji;\r\n }\r\n\r\n // the replace is done to handle multiple lines\r\n return `> ${emoji ? emoji + \" \" : \"\"}${text.replace(/\\n/g, \" \\n>\")}`;\r\n};\r\n\r\nexport const bullet = (text: string, count?: number) => {\r\n return count ? `${count}. ${text}` : `- ${text}`;\r\n};\r\n\r\nexport const todo = (text: string, checked: boolean) => {\r\n return checked ? `- [x] ${text}` : `- [ ] ${text}`;\r\n};\r\n\r\nexport const image = (alt: string, href: string) => {\r\n return `![${alt}](${href})`;\r\n};\r\n\r\nexport const addTabSpace = (text: string, n = 0) => {\r\n const tab = \"\t\";\r\n for (let i = 0; i < n; i++) {\r\n if (text.includes(\"\\n\")) {\r\n const multiLineText = text.split(/(?<=\\n)/).join(tab);\r\n text = tab + multiLineText;\r\n } else text = tab + text;\r\n }\r\n return text;\r\n};\r\n\r\nexport const divider = () => {\r\n return \"---\";\r\n};\r\n\r\nexport const toggle = (summary?: string, children?: string) => {\r\n if(!summary) return children || \"\"\r\n return `<details>\r\n <summary>${summary}</summary>\r\n\r\n ${children || \"\"}\r\n\r\n </details>`;\r\n};\r\n\r\nexport const table = (cells: string[][]) => {\r\n return markdownTable(cells);\r\n};\r\n"]}
@@ -78,4 +78,16 @@ describe("Image", () => {
78
78
  expect((0, md_1.image)("simple text", "https://example.com/image")).toBe(`![simple text](https://example.com/image)`);
79
79
  });
80
80
  });
81
+ describe("Toggle", () => {
82
+ const noSpaces = (text) => text.replace(/\s+/g, '');
83
+ test("displays content if toggle title is empty", () => {
84
+ expect(noSpaces((0, md_1.toggle)(undefined, "content"))).toBe("content");
85
+ });
86
+ test("return empty string if title and content are empty", () => {
87
+ expect(noSpaces((0, md_1.toggle)(undefined, undefined))).toBe("");
88
+ });
89
+ test("Displays toggle with <details> and <summary>", () => {
90
+ expect(noSpaces((0, md_1.toggle)("title", "content"))).toBe("<details><summary>title</summary>content</details>");
91
+ });
92
+ });
81
93
  //# sourceMappingURL=md.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"md.spec.js","sourceRoot":"","sources":["../../src/utils/md.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n callout,\r\n table,\r\n inlineCode,\r\n bold,\r\n italic,\r\n strikethrough,\r\n underline,\r\n link,\r\n codeBlock,\r\n heading1,\r\n heading2,\r\n heading3,\r\n quote,\r\n bullet,\r\n todo,\r\n image,\r\n} from \"./md\";\r\n\r\ndescribe(\"Callout\", () => {\r\n test(\"parses callout without emoji\", () => {\r\n const text = \"Call out text content.\";\r\n\r\n expect(callout(text)).toBe(`> ${text}`);\r\n });\r\n\r\n test(\"parses callout with emoji\", () => {\r\n const text = \"Call out text content.\";\r\n\r\n expect(\r\n callout(text, {\r\n type: \"emoji\",\r\n emoji: \"😍\",\r\n })\r\n ).toBe(`> 😍 ${text}`);\r\n });\r\n});\r\n\r\ndescribe(\"Markdown Table\", () => {\r\n test(\"parse simple table to markdown table\", () => {\r\n const mockTable = [\r\n [\"number\", \"char\"],\r\n [\"1\", \"a\"],\r\n [\"2\", \"b\"],\r\n ];\r\n\r\n expect(table(mockTable)).toBe(\r\n `\r\n| number | char |\r\n| ------ | ---- |\r\n| 1 | a |\r\n| 2 | b |\r\n `.trim()\r\n );\r\n });\r\n});\r\n\r\ndescribe(\"Text Annotations\", () => {\r\n test(\"Inline Code\", () => {\r\n expect(inlineCode(\"simple text\")).toBe(\"`simple text`\");\r\n });\r\n test(\"Code Block\", () => {\r\n expect(codeBlock(\"simple text\", \"javascript\")).toBe(\r\n `\\`\\`\\`javascript\r\nsimple text\r\n\\`\\`\\``.trim()\r\n );\r\n });\r\n test(\"Bold\", () => {\r\n expect(bold(\"simple text\")).toBe(\"**simple text**\");\r\n });\r\n test(\"Italic\", () => {\r\n expect(italic(\"simple text\")).toBe(\"_simple text_\");\r\n });\r\n test(\"StrikeThrough\", () => {\r\n expect(strikethrough(\"simple text\")).toBe(\"~~simple text~~\");\r\n });\r\n test(\"Underline\", () => {\r\n expect(underline(\"simple text\")).toBe(\"<u>simple text</u>\");\r\n });\r\n});\r\n\r\ndescribe(\"Headings\", () => {\r\n test(\"Heading 1\", () => {\r\n expect(heading1(\"simple text\")).toBe(\"# simple text\");\r\n });\r\n test(\"Heading 2\", () => {\r\n expect(heading2(\"simple text\")).toBe(\"## simple text\");\r\n });\r\n test(\"Heading 3\", () => {\r\n expect(heading3(\"simple text\")).toBe(\"### simple text\");\r\n });\r\n});\r\n\r\ndescribe(\"List Elements\", () => {\r\n test(\"Bullet\", () => {\r\n expect(bullet(\"simple text\")).toBe(\"- simple text\");\r\n });\r\n\r\n test(\"Checked todo\", () => {\r\n expect(todo(\"simple text\", true)).toBe(\"- [x] simple text\");\r\n });\r\n\r\n test(\"Unchecked todo\", () => {\r\n expect(todo(\"simple text\", false)).toBe(\"- [ ] simple text\");\r\n });\r\n});\r\n\r\ndescribe(\"Image\", () => {\r\n test(\"Image with alt text\", () => {\r\n expect(image(\"simple text\", \"https://example.com/image\")).toBe(\r\n `![simple text](https://example.com/image)`\r\n );\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"md.spec.js","sourceRoot":"","sources":["../../src/utils/md.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n callout,\r\n table,\r\n inlineCode,\r\n bold,\r\n italic,\r\n strikethrough,\r\n underline,\r\n link,\r\n codeBlock,\r\n heading1,\r\n heading2,\r\n heading3,\r\n quote,\r\n bullet,\r\n todo,\r\n toggle,\r\n image,\r\n} from \"./md\";\r\n\r\ndescribe(\"Callout\", () => {\r\n test(\"parses callout without emoji\", () => {\r\n const text = \"Call out text content.\";\r\n\r\n expect(callout(text)).toBe(`> ${text}`);\r\n });\r\n\r\n test(\"parses callout with emoji\", () => {\r\n const text = \"Call out text content.\";\r\n\r\n expect(\r\n callout(text, {\r\n type: \"emoji\",\r\n emoji: \"😍\",\r\n })\r\n ).toBe(`> 😍 ${text}`);\r\n });\r\n});\r\n\r\ndescribe(\"Markdown Table\", () => {\r\n test(\"parse simple table to markdown table\", () => {\r\n const mockTable = [\r\n [\"number\", \"char\"],\r\n [\"1\", \"a\"],\r\n [\"2\", \"b\"],\r\n ];\r\n\r\n expect(table(mockTable)).toBe(\r\n `\r\n| number | char |\r\n| ------ | ---- |\r\n| 1 | a |\r\n| 2 | b |\r\n `.trim()\r\n );\r\n });\r\n});\r\n\r\ndescribe(\"Text Annotations\", () => {\r\n test(\"Inline Code\", () => {\r\n expect(inlineCode(\"simple text\")).toBe(\"`simple text`\");\r\n });\r\n test(\"Code Block\", () => {\r\n expect(codeBlock(\"simple text\", \"javascript\")).toBe(\r\n `\\`\\`\\`javascript\r\nsimple text\r\n\\`\\`\\``.trim()\r\n );\r\n });\r\n test(\"Bold\", () => {\r\n expect(bold(\"simple text\")).toBe(\"**simple text**\");\r\n });\r\n test(\"Italic\", () => {\r\n expect(italic(\"simple text\")).toBe(\"_simple text_\");\r\n });\r\n test(\"StrikeThrough\", () => {\r\n expect(strikethrough(\"simple text\")).toBe(\"~~simple text~~\");\r\n });\r\n test(\"Underline\", () => {\r\n expect(underline(\"simple text\")).toBe(\"<u>simple text</u>\");\r\n });\r\n});\r\n\r\ndescribe(\"Headings\", () => {\r\n test(\"Heading 1\", () => {\r\n expect(heading1(\"simple text\")).toBe(\"# simple text\");\r\n });\r\n test(\"Heading 2\", () => {\r\n expect(heading2(\"simple text\")).toBe(\"## simple text\");\r\n });\r\n test(\"Heading 3\", () => {\r\n expect(heading3(\"simple text\")).toBe(\"### simple text\");\r\n });\r\n});\r\n\r\ndescribe(\"List Elements\", () => {\r\n test(\"Bullet\", () => {\r\n expect(bullet(\"simple text\")).toBe(\"- simple text\");\r\n });\r\n\r\n test(\"Checked todo\", () => {\r\n expect(todo(\"simple text\", true)).toBe(\"- [x] simple text\");\r\n });\r\n\r\n test(\"Unchecked todo\", () => {\r\n expect(todo(\"simple text\", false)).toBe(\"- [ ] simple text\");\r\n });\r\n});\r\n\r\ndescribe(\"Image\", () => {\r\n test(\"Image with alt text\", () => {\r\n expect(image(\"simple text\", \"https://example.com/image\")).toBe(\r\n `![simple text](https://example.com/image)`\r\n );\r\n });\r\n});\r\n\r\ndescribe(\"Toggle\", () => {\r\n const noSpaces = (text: string) => text.replace(/\\s+/g, '')\r\n test(\"displays content if toggle title is empty\", () => {\r\n expect(noSpaces(toggle(undefined, \"content\"))).toBe(\r\n \"content\"\r\n );\r\n })\r\n test(\"return empty string if title and content are empty\", () => {\r\n expect(noSpaces(toggle(undefined, undefined))).toBe(\r\n \"\"\r\n );\r\n })\r\n test(\"Displays toggle with <details> and <summary>\", () => {\r\n expect(noSpaces(toggle(\"title\", \"content\"))).toBe(\r\n \"<details><summary>title</summary>content</details>\"\r\n );\r\n })\r\n})"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "notion-to-md",
3
- "version": "2.4.1",
3
+ "version": "2.5.0",
4
4
  "engines": {
5
5
  "node": ">=12"
6
6
  },