notion-to-md 2.5.6 → 2.6.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
@@ -1,37 +1,32 @@
1
- <img src="https://imgur.com/WgXdz9r.png" />
2
1
 
3
- > 💡 For better readability and detailed instructions head over to the [wiki](https://github.com/souvikinator/notion-to-md/wiki).
2
+ <!--
3
+ 💡 For better readability and detailed instructions head over to the [wiki](https://github.com/souvikinator/notion-to-md/wiki).
4
+ -->
5
+ <h1 align="center">
6
+ <br>
7
+ <img src="https://imgur.com/WgXdz9r.png" alt="notion-to-md banner" width="750" />
8
+ <br>
9
+ <b>Notion-to-MD</b>
10
+ <br>
11
+ <sub><sup><b>(Notion to Markdown)</b></sup></sub>
12
+ <br>
13
+ </h1>
4
14
 
5
- # Notion to Markdown
15
+ <p align="center">
16
+ Notion-to-MD is a Node.js package that allows you to convert Notion pages to Markdown format.
17
+ </p>
18
+ <p align="center">
19
+ Convert notion pages, block and list of blocks to markdown (supports nesting) using <a href="https://github.com/makenotion/notion-sdk-js">notion-sdk-js</a>
20
+ </p>
21
+ <p align="center">
22
+ <img src="https://img.shields.io/github/stars/souvikinator/notion-to-md?style=for-the-badge"
23
+ alt="">
24
+ <a href="https://www.producthunt.com/products/notion-to-md?utm_source=badge-follow&utm_medium=badge&utm_souce=badge-notion&#0045;to&#0045;md" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/follow.svg?product_id=486574&theme=light&size=small" alt="notion&#0045;to&#0045;md - Programmatically&#0032;convert&#0032;notion&#0032;pages&#0032;to&#0032;markdown | Product Hunt" style="width: 86px; height: 32px;" width="86" height="32" /></a>
25
+
26
+ </p>
6
27
 
7
- Convert notion pages, block and list of blocks to markdown (supports nesting) using **[notion-sdk-js](https://github.com/makenotion/notion-sdk-js)**
8
28
 
9
- > **Note:** Before getting started, create [an integration and find the token](https://www.notion.so/my-integrations).
10
29
 
11
- <a href="https://www.producthunt.com/posts/notion-to-md?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-notion&#0045;to&#0045;md" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=351669&theme=light" alt="notion&#0045;to&#0045;md - Programmatically&#0032;convert&#0032;notion&#0032;pages&#0032;to&#0032;markdown | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
12
-
13
- [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/O5O1AFCJR)
14
-
15
- ## Todo
16
-
17
- - [x] heading
18
- - [x] images
19
- - [x] quotes
20
- - [x] links
21
- - [x] bullets
22
- - [x] todo
23
- - [x] inline code
24
- - [x] code block
25
- - [x] strikethrough, underline, bold, italic
26
- - [x] nested blocks
27
- - [x] embeds, bookmarks, videos, files (converted to links)
28
- - [x] simple tables
29
- - [x] toggle
30
- - [x] divider
31
- - [x] equation block (converted to code blocks)
32
- - [x] convert returned markdown object to string (`toMarkdownString()`)
33
- - [x] typescript support
34
- - [x] add tests
35
30
 
36
31
  ## Install
37
32
 
@@ -40,18 +35,19 @@ npm install notion-to-md
40
35
  ```
41
36
 
42
37
  ## Usage
38
+ > **Note:** Before getting started, create [an integration and find the token](https://www.notion.so/my-integrations).
39
+ > Details on methods can be found in [API section](https://github.com/souvikinator/notion-to-md#api)
43
40
 
44
- > **Note:** Details on methods can be found in [API section](https://github.com/souvikinator/notion-to-md#api)
45
-
46
- ### converting markdown objects to markdown string
41
+ ## converting markdown objects to markdown string
47
42
 
48
43
  This is how the notion page looks for this example:
49
44
 
50
- ![Imgur](https://imgur.com/O6bKCmH.png)
45
+ <img src="https://imgur.com/O6bKCmH.png" width="500" />
51
46
 
52
- ```js
47
+ ```javascript
53
48
  const { Client } = require("@notionhq/client");
54
49
  const { NotionToMarkdown } = require("notion-to-md");
50
+ const fs = require('fs');
55
51
  // or
56
52
  // import {NotionToMarkdown} from "notion-to-md";
57
53
 
@@ -65,23 +61,88 @@ const n2m = new NotionToMarkdown({ notionClient: notion });
65
61
  (async () => {
66
62
  const mdblocks = await n2m.pageToMarkdown("target_page_id");
67
63
  const mdString = n2m.toMarkdownString(mdblocks);
64
+ console.log(mdString);
65
+ })();
66
+ ```
67
+
68
+ **Output:**
69
+
70
+ <img src="https://imgur.com/XrUYrZ0.png" width="500" />
71
+
72
+ ## Save content to file
73
+
74
+ **parent page content:**
68
75
 
76
+ <img src="https://user-images.githubusercontent.com/64456160/236519171-b32d8f62-1e2c-4897-a302-ae0dd85adef9.png" width="500" />
77
+
78
+ **child page content:**
79
+
80
+ <img src="https://user-images.githubusercontent.com/64456160/236519726-37513735-db0c-4643-9c89-f8deb355a6d3.png" width="500" />
81
+
82
+ ### Saving page to a file
83
+
84
+ Simply saving `mdString` from above code to a file does the work like so
85
+
86
+ ```javascript
69
87
  //writing to file
70
88
  fs.writeFile("test.md", mdString, (err) => {
71
89
  console.log(err);
72
90
  });
91
+ ```
92
+ > ⚠️ **Note**: with this the `child_page` content is merged in the same file.
93
+
94
+ **Output:**
95
+
96
+ <img src="https://user-images.githubusercontent.com/64456160/236520621-fc1d328f-51e3-4e39-a529-7ef1b9f75ab3.png" width="500" />
97
+
98
+ ### Saving `child_page` to separate file
99
+
100
+ `NotionToMarkdown` takes second argument, `config`
101
+
102
+
103
+ ```javascript
104
+ const { Client } = require("@notionhq/client");
105
+ const { NotionToMarkdown } = require("notion-to-md");
106
+ const fs = require('fs');
107
+ // or
108
+ // import {NotionToMarkdown} from "notion-to-md";
109
+
110
+ const notion = new Client({
111
+ auth: "your integration token",
112
+ config:{
113
+ saveChildPage: true, //default: false
114
+ saveToDir: "path/to/output/dir", //default: current directory
115
+ }
116
+ });
117
+
118
+ // passing notion client to the option
119
+ const n2m = new NotionToMarkdown({ notionClient: notion });
120
+
121
+ (async () => {
122
+ const mdblocks = await n2m.pageToMarkdown("target_page_id");
123
+ const mdString = n2m.toMarkdownString(mdblocks);
124
+
125
+ // writing parent page content to file
126
+ // where the child pages will be saved
127
+ // the child page will be linked to the parent page
128
+ fs.writeFile("test.md", mdString, (err) => {
129
+ console.log(err);
130
+ });
73
131
  })();
74
132
  ```
75
133
 
76
134
  **Output:**
77
135
 
78
- ![output](https://imgur.com/XrUYrZ0.png)
136
+ > ⚠️ **Note:** make sure to save parent page in the same directory as that of child page
137
+ > for the link from parent to child page to work.
79
138
 
80
- ### converting page to markdown object
139
+ <img src="https://user-images.githubusercontent.com/64456160/236521464-fd137be9-ade1-444b-86fc-562d5ad06568.png" width="500" />
140
+ <img src="https://user-images.githubusercontent.com/64456160/236521541-c08d6062-9229-4429-96d5-78ab699600a1.png" width="500" />
81
141
 
82
- Example notion page:
142
+ ## converting page to markdown object
83
143
 
84
- ![Imgur](https://imgur.com/9iqRpBl.png)
144
+ **Example notion page:**
145
+ <img src="https://imgur.com/9iqRpBl.png" width="500" />
85
146
 
86
147
  ```js
87
148
  const { Client } = require("@notionhq/client");
@@ -146,9 +207,7 @@ const n2m = new NotionToMarkdown({ notionClient: notion });
146
207
  ]
147
208
  ```
148
209
 
149
- ### converting list of blocks to markdown object
150
-
151
- same notion page as before
210
+ ## converting list of blocks to markdown object
152
211
 
153
212
  ```js
154
213
  const { Client } = require("@notionhq/client");
@@ -175,7 +234,7 @@ const n2m = new NotionToMarkdown({ notionClient: notion });
175
234
 
176
235
  **Output**: same as before
177
236
 
178
- ### Converting a single block to markdown string
237
+ ## Converting a single block to markdown string
179
238
 
180
239
  - only takes a single notion block and returns corresponding markdown string
181
240
  - nesting is ignored
@@ -1,9 +1,11 @@
1
- import { Annotations, CustomTransformer, ListBlockChildrenResponseResult, ListBlockChildrenResponseResults, MdBlock, NotionToMarkdownOptions } from './types';
1
+ import { Annotations, CustomTransformer, ListBlockChildrenResponseResult, ListBlockChildrenResponseResults, MdBlock, NotionToMarkdownOptions } 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 config;
8
+ private targetPage;
7
9
  private customTransformers;
8
10
  constructor(options: NotionToMarkdownOptions);
9
11
  setCustomTransformer(type: string, transformer: CustomTransformer): NotionToMarkdown;
@@ -13,7 +15,7 @@ export declare class NotionToMarkdown {
13
15
  * @param {number} nestingLevel - Defines max depth of nesting
14
16
  * @returns {string} - Returns markdown string
15
17
  */
16
- toMarkdownString(mdBlocks?: MdBlock[], nestingLevel?: number): string;
18
+ toMarkdownString(mdBlocks?: MdBlock[], pageName?: string, nestingLevel?: number): string;
17
19
  /**
18
20
  * Retrieves Notion Blocks based on ID and converts them to Markdown Blocks
19
21
  * @param {string} id - notion page id (not database id)
@@ -1 +1 @@
1
- {"version":3,"file":"notion-to-md.d.ts","sourceRoot":"","sources":["../src/notion-to-md.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,+BAA+B,EAC/B,gCAAgC,EAChC,OAAO,EACP,uBAAuB,EAGxB,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,kBAAkB,CAAoC;gBAClD,OAAO,EAAE,uBAAuB;IAI5C,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,iBAAiB,GAC7B,gBAAgB;IAKnB;;;;;OAKG;IACH,gBAAgB,CAAC,QAAQ,GAAE,OAAO,EAAO,EAAE,YAAY,GAAE,MAAU,GAAG,MAAM;IAuC5E;;;;;OAKG;IACG,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,MAAM,GAAG,IAAW,GAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;IAgBrB;;;;;;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;IAuDrB;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,+BAA+B;IAyT5D;;;;;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":"AAIA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,+BAA+B,EAC/B,gCAAgC,EAChC,OAAO,EACP,uBAAuB,EAIxB,MAAM,SAAS,CAAC;AAKjB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAoC;gBAElD,OAAO,EAAE,uBAAuB;IAW5C,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,iBAAiB,GAC7B,gBAAgB;IAMnB;;;;;OAKG;IACH,gBAAgB,CACd,QAAQ,GAAE,OAAO,EAAO,EACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,YAAY,GAAE,MAAU,GACvB,MAAM;IAmET;;;;;OAKG;IACG,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,MAAM,GAAG,IAAW,GAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;IAcrB;;;;;;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;IAkDrB;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,+BAA+B;IA4P5D;;;;;OAKG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM;CAsBlE"}
@@ -24,14 +24,23 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.NotionToMarkdown = void 0;
27
+ const fs_extra_1 = require("fs-extra");
28
+ const path = __importStar(require("path"));
27
29
  const md = __importStar(require("./utils/md"));
28
30
  const notion_1 = require("./utils/notion");
31
+ const misc_1 = require("./utils/misc");
29
32
  /**
30
33
  * Converts a Notion page to Markdown.
31
34
  */
32
35
  class NotionToMarkdown {
33
36
  constructor(options) {
34
37
  this.notionClient = options.notionClient;
38
+ const defaultConfig = {
39
+ saveChildPage: false,
40
+ saveToDir: ".",
41
+ };
42
+ this.targetPage = "";
43
+ this.config = { ...defaultConfig, ...options.config };
35
44
  this.customTransformers = {};
36
45
  }
37
46
  setCustomTransformer(type, transformer) {
@@ -44,11 +53,14 @@ class NotionToMarkdown {
44
53
  * @param {number} nestingLevel - Defines max depth of nesting
45
54
  * @returns {string} - Returns markdown string
46
55
  */
47
- toMarkdownString(mdBlocks = [], nestingLevel = 0) {
56
+ toMarkdownString(mdBlocks = [], pageName, nestingLevel = 0) {
48
57
  let mdString = "";
49
58
  mdBlocks.forEach((mdBlocks) => {
59
+ // NOTE: toggle in the child blocks logic
60
+ // adding a toggle check prevents duplicate
61
+ // rendering of toggle title
50
62
  // process parent blocks
51
- if (mdBlocks.parent) {
63
+ if (mdBlocks.parent && mdBlocks.type !== "toggle") {
52
64
  if (mdBlocks.type !== "to_do" &&
53
65
  mdBlocks.type !== "bulleted_list_item" &&
54
66
  mdBlocks.type !== "numbered_list_item") {
@@ -62,15 +74,34 @@ class NotionToMarkdown {
62
74
  // process child blocks
63
75
  if (mdBlocks.children && mdBlocks.children.length > 0) {
64
76
  if (mdBlocks.type === "synced_block" ||
65
- mdBlocks.type === "child_page") {
77
+ mdBlocks.type === "column_list" ||
78
+ mdBlocks.type === "column") {
66
79
  let mdstr = this.toMarkdownString(mdBlocks.children);
67
- // console.log(mdstr);
68
80
  mdString += mdstr;
69
81
  }
82
+ else if (mdBlocks.type === "child_page") {
83
+ let mdstr = this.toMarkdownString(mdBlocks.children);
84
+ if (this.config.saveChildPage && this.config.saveToDir) {
85
+ const childPageTitle = (0, misc_1.extractTitleFromMdLink)(mdBlocks.parent);
86
+ const fileName = childPageTitle.split(" ").join("-");
87
+ const filePath = path.join(this.config.saveToDir, `${fileName}.md`);
88
+ // save to file
89
+ (0, fs_extra_1.ensureFile)(filePath).then(() => {
90
+ (0, fs_extra_1.writeFile)(filePath, mdstr);
91
+ });
92
+ }
93
+ else {
94
+ mdString += mdstr;
95
+ }
96
+ }
97
+ else if (mdBlocks.type === "toggle") {
98
+ // convert children md object to md string
99
+ const toggle_children_md_string = this.toMarkdownString(mdBlocks.children);
100
+ mdString += md.toggle(mdBlocks.parent, toggle_children_md_string);
101
+ }
70
102
  else {
71
- let mdstr = this.toMarkdownString(mdBlocks.children, nestingLevel + 1);
103
+ let mdstr = this.toMarkdownString(mdBlocks.children, pageName, nestingLevel + 1);
72
104
  mdString += mdstr;
73
- // console.log(mdstr);
74
105
  }
75
106
  }
76
107
  });
@@ -86,9 +117,9 @@ class NotionToMarkdown {
86
117
  if (!this.notionClient) {
87
118
  throw new Error("notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md");
88
119
  }
120
+ this.targetPage = id;
89
121
  const blocks = await (0, notion_1.getBlockChildren)(this.notionClient, id, totalPage);
90
122
  const parsedData = await this.blocksToMarkdown(blocks);
91
- // console.log(JSON.stringify(parsedData, null, 4));
92
123
  return parsedData;
93
124
  }
94
125
  /**
@@ -106,11 +137,7 @@ class NotionToMarkdown {
106
137
  return mdBlocks;
107
138
  for (let i = 0; i < blocks.length; i++) {
108
139
  let block = blocks[i];
109
- if ("has_children" in block &&
110
- block.has_children &&
111
- block.type !== "column_list" &&
112
- block.type !== "toggle" &&
113
- block.type !== "callout") {
140
+ if ("has_children" in block && block.has_children) {
114
141
  // Get children of this block.
115
142
  let child_blocks = await (0, notion_1.getBlockChildren)(this.notionClient, block.id, totalPage);
116
143
  // Push this block to mdBlocks.
@@ -126,13 +153,12 @@ class NotionToMarkdown {
126
153
  continue;
127
154
  }
128
155
  let tmp = await this.blockToMarkdown(block);
129
- // console.log(block);
130
156
  mdBlocks.push({
131
157
  // @ts-ignore
132
158
  type: block.type,
133
159
  blockId: block.id,
134
160
  parent: tmp,
135
- children: []
161
+ children: [],
136
162
  });
137
163
  }
138
164
  return mdBlocks;
@@ -143,7 +169,6 @@ class NotionToMarkdown {
143
169
  * @returns {string} corresponding markdown string of the passed block
144
170
  */
145
171
  async blockToMarkdown(block) {
146
- var _a;
147
172
  if (typeof block !== "object" || !("type" in block))
148
173
  return "";
149
174
  let parsedData = "";
@@ -170,7 +195,7 @@ class NotionToMarkdown {
170
195
  case "divider": {
171
196
  return md.divider();
172
197
  }
173
- case 'equation': {
198
+ case "equation": {
174
199
  return md.equation(block.equation.expression);
175
200
  }
176
201
  case "video":
@@ -197,8 +222,6 @@ class NotionToMarkdown {
197
222
  case "embed":
198
223
  case "link_preview":
199
224
  case "link_to_page":
200
- case "child_page":
201
- case "child_database":
202
225
  {
203
226
  let blockContent;
204
227
  let title = type;
@@ -212,24 +235,32 @@ class NotionToMarkdown {
212
235
  block.link_to_page.type === "page_id") {
213
236
  blockContent = { url: block.link_to_page.page_id };
214
237
  }
215
- if (type === "child_page") {
216
- blockContent = { url: block.id };
217
- title = block.child_page.title;
218
- }
219
- if (type === "child_database") {
220
- blockContent = { url: block.id };
221
- title = block.child_database.title || "child_database";
222
- }
223
238
  if (blockContent)
224
239
  return md.link(title, blockContent.url);
225
240
  }
226
241
  break;
242
+ case "child_page":
243
+ {
244
+ let pageTitle = block.child_page.title;
245
+ if (this.config.saveChildPage) {
246
+ const fileName = pageTitle.split(" ").join("-");
247
+ const filePath = `${fileName}.md`;
248
+ return md.link(pageTitle, filePath);
249
+ }
250
+ return md.heading2(pageTitle);
251
+ }
252
+ break;
253
+ case "child_database":
254
+ {
255
+ let pageTitle = block.child_database.title || `child_database`;
256
+ return pageTitle;
257
+ }
258
+ break;
227
259
  case "table": {
228
260
  const { id, has_children } = block;
229
261
  let tableArr = [];
230
262
  if (has_children) {
231
263
  const tableRows = await (0, notion_1.getBlockChildren)(this.notionClient, id, 100);
232
- // console.log(">>", tableRows);
233
264
  let rowsPromise = tableRows === null || tableRows === void 0 ? void 0 : tableRows.map(async (row) => {
234
265
  const { type } = row;
235
266
  const cells = row[type]["cells"];
@@ -243,47 +274,12 @@ class NotionToMarkdown {
243
274
  paragraph: { rich_text: cell },
244
275
  }));
245
276
  const cellStringArr = await Promise.all(cellStringPromise);
246
- // console.log("~~", cellStringArr);
247
277
  tableArr.push(cellStringArr);
248
- // console.log(tableArr);
249
278
  });
250
279
  await Promise.all(rowsPromise || []);
251
280
  }
252
281
  return md.table(tableArr);
253
282
  }
254
- // NOTE: column_list is parent of columns
255
- case "column_list": {
256
- const { id, has_children } = block;
257
- if (!has_children)
258
- return "";
259
- const column_list_children = await (0, notion_1.getBlockChildren)(this.notionClient, id, 100);
260
- let column_list_promise = column_list_children.map(async (column) => await this.blockToMarkdown(column));
261
- let column_list = await Promise.all(column_list_promise);
262
- return column_list.join("\n\n");
263
- }
264
- case "column": {
265
- const { id, has_children } = block;
266
- if (!has_children)
267
- return "";
268
- const column_children = await (0, notion_1.getBlockChildren)(this.notionClient, id, 100);
269
- let column_children_mdBlocks = await this.blocksToMarkdown(column_children);
270
- let column_string = this.toMarkdownString(column_children_mdBlocks);
271
- return column_string;
272
- }
273
- case "toggle": {
274
- const { id, has_children } = block;
275
- const toggle_summary = (_a = block.toggle.rich_text[0]) === null || _a === void 0 ? void 0 : _a.plain_text;
276
- // empty toggle
277
- if (!has_children) {
278
- return md.toggle(toggle_summary);
279
- }
280
- const toggle_children_object = await (0, notion_1.getBlockChildren)(this.notionClient, id, 100);
281
- // parse children blocks to md object
282
- const toggle_children = await this.blocksToMarkdown(toggle_children_object);
283
- // convert children md object to md string
284
- const toggle_children_md_string = this.toMarkdownString(toggle_children);
285
- return md.toggle(toggle_summary, toggle_children_md_string);
286
- }
287
283
  // Rest of the types
288
284
  // "paragraph"
289
285
  // "heading_1"
@@ -301,8 +297,6 @@ class NotionToMarkdown {
301
297
  // "callout"
302
298
  // "breadcrumb"
303
299
  // "table_of_contents"
304
- // "column_list"
305
- // "column"
306
300
  // "link_to_page"
307
301
  // "audio"
308
302
  // "unsupported"
@@ -311,7 +305,7 @@ class NotionToMarkdown {
311
305
  // @ts-ignore
312
306
  let blockContent = block[type].text || block[type].rich_text || [];
313
307
  blockContent.map((content) => {
314
- if (content.type === 'equation') {
308
+ if (content.type === "equation") {
315
309
  parsedData += md.inlineEquation(content.equation.expression);
316
310
  return;
317
311
  }
@@ -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';\n\nimport {\n Annotations,\n CustomTransformer,\n ListBlockChildrenResponseResult,\n ListBlockChildrenResponseResults,\n MdBlock,\n NotionToMarkdownOptions,\n Equation,\n Text,\n} from './types';\nimport * as md from './utils/md';\nimport { getBlockChildren } from './utils/notion';\n\n/**\n * Converts a Notion page to Markdown.\n */\nexport class NotionToMarkdown {\n private notionClient: Client;\n private customTransformers: Record<string, CustomTransformer>;\n constructor(options: NotionToMarkdownOptions) {\n this.notionClient = options.notionClient;\n this.customTransformers = {};\n }\n setCustomTransformer(\n type: string,\n transformer: CustomTransformer\n ): NotionToMarkdown {\n this.customTransformers[type] = transformer;\n\n return this;\n }\n /**\n * Converts Markdown Blocks to string\n * @param {MdBlock[]} mdBlocks - Array of markdown blocks\n * @param {number} nestingLevel - Defines max depth of nesting\n * @returns {string} - Returns markdown string\n */\n toMarkdownString(mdBlocks: MdBlock[] = [], nestingLevel: number = 0): string {\n let mdString = \"\";\n mdBlocks.forEach((mdBlocks) => {\n // process parent blocks\n if (mdBlocks.parent) {\n if (\n mdBlocks.type !== \"to_do\" &&\n mdBlocks.type !== \"bulleted_list_item\" &&\n mdBlocks.type !== \"numbered_list_item\"\n ) {\n // add extra line breaks non list blocks\n mdString += `\\n${md.addTabSpace(mdBlocks.parent, nestingLevel)}\\n\\n`;\n } else {\n mdString += `${md.addTabSpace(mdBlocks.parent, nestingLevel)}\\n`;\n }\n }\n\n // process child blocks\n if (mdBlocks.children && mdBlocks.children.length > 0) {\n if (\n mdBlocks.type === \"synced_block\" ||\n mdBlocks.type === \"child_page\"\n ) {\n let mdstr = this.toMarkdownString(mdBlocks.children);\n // console.log(mdstr);\n mdString += mdstr;\n } else {\n let mdstr = this.toMarkdownString(\n mdBlocks.children,\n nestingLevel + 1\n );\n mdString += mdstr;\n // console.log(mdstr);\n }\n }\n });\n return mdString;\n }\n\n /**\n * Retrieves Notion Blocks based on ID and converts them to Markdown Blocks\n * @param {string} id - notion page id (not database id)\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100 (Default=null)\n * @returns {Promise<MdBlock[]>} - List of markdown blocks\n */\n async pageToMarkdown(\n id: string,\n totalPage: number | null = null\n ): Promise<MdBlock[]> {\n if (!this.notionClient) {\n throw new Error(\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\n );\n }\n\n const blocks = await getBlockChildren(this.notionClient, id, totalPage);\n\n const parsedData = await this.blocksToMarkdown(blocks);\n\n // console.log(JSON.stringify(parsedData, null, 4));\n\n return parsedData;\n }\n\n /**\n * Converts list of Notion Blocks to Markdown Blocks\n * @param {ListBlockChildrenResponseResults | undefined} blocks - List of notion blocks\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100\n * @param {MdBlock[]} mdBlocks - Defines max depth of nesting\n * @returns {Promise<MdBlock[]>} - Array of markdown blocks with their children\n */\n async blocksToMarkdown(\n blocks?: ListBlockChildrenResponseResults,\n totalPage: number | null = null,\n mdBlocks: MdBlock[] = []\n ): Promise<MdBlock[]> {\n if (!this.notionClient) {\n throw new Error(\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\n );\n }\n\n if (!blocks) return mdBlocks;\n\n for (let i = 0; i < blocks.length; i++) {\n let block = blocks[i];\n if (\n \"has_children\" in block &&\n block.has_children &&\n block.type !== \"column_list\" &&\n block.type !== \"toggle\" &&\n block.type !== \"callout\"\n ) {\n // Get children of this block.\n let child_blocks = await getBlockChildren(\n this.notionClient,\n block.id,\n totalPage\n );\n\n // Push this block to mdBlocks.\n mdBlocks.push({\n type: block.type,\n blockId: block.id,\n parent: await this.blockToMarkdown(block),\n children: [],\n });\n\n // Recursively call blocksToMarkdown to get children of this block.\n let l = mdBlocks.length;\n await this.blocksToMarkdown(\n child_blocks,\n totalPage,\n mdBlocks[l - 1].children\n );\n continue;\n }\n let tmp = await this.blockToMarkdown(block);\n // console.log(block);\n mdBlocks.push({\n // @ts-ignore\n type: block.type,\n blockId: block.id,\n parent: tmp,\n children: []\n });\n }\n return mdBlocks;\n }\n\n /**\n * Converts a Notion Block to a Markdown Block\n * @param {ListBlockChildrenResponseResult} block - single notion block\n * @returns {string} corresponding markdown string of the passed block\n */\n async blockToMarkdown(block: ListBlockChildrenResponseResult) {\n if (typeof block !== \"object\" || !(\"type\" in block)) return \"\";\n\n let parsedData = \"\";\n const { type } = block;\n if (type in this.customTransformers && !!this.customTransformers[type]) {\n const customTransformerValue = await this.customTransformers[type](block);\n if (!!customTransformerValue || customTransformerValue === \"\")\n return customTransformerValue;\n }\n\n switch (type) {\n case \"image\":\n {\n let blockContent = block.image;\n const image_caption_plain = blockContent.caption\n .map((item) => item.plain_text)\n .join(\"\");\n const image_type = blockContent.type;\n if (image_type === \"external\")\n return md.image(image_caption_plain, blockContent.external.url);\n if (image_type === \"file\")\n return md.image(image_caption_plain, blockContent.file.url);\n }\n break;\n\n case \"divider\": {\n return md.divider();\n }\n\n case 'equation': {\n return md.equation(block.equation.expression);\n }\n\n case \"video\":\n case \"file\":\n case \"pdf\":\n {\n let blockContent;\n if (type === \"video\") blockContent = block.video;\n if (type === \"file\") blockContent = block.file;\n if (type === \"pdf\") blockContent = block.pdf;\n if (blockContent) {\n const file_type = blockContent.type;\n if (file_type === \"external\")\n return md.link(\"image\", blockContent.external.url);\n if (file_type === \"file\")\n return md.link(\"image\", blockContent.file.url);\n }\n }\n break;\n\n case \"bookmark\":\n case \"embed\":\n case \"link_preview\":\n case \"link_to_page\":\n case \"child_page\":\n case \"child_database\":\n {\n let blockContent;\n let title: string = type;\n if (type === \"bookmark\") blockContent = block.bookmark;\n if (type === \"embed\") blockContent = block.embed;\n if (type === \"link_preview\") blockContent = block.link_preview;\n if (\n type === \"link_to_page\" &&\n block.link_to_page.type === \"page_id\"\n ) {\n blockContent = { url: block.link_to_page.page_id };\n }\n\n if (type === \"child_page\") {\n blockContent = { url: block.id };\n title = block.child_page.title;\n }\n\n if (type === \"child_database\") {\n blockContent = { url: block.id };\n title = block.child_database.title || \"child_database\";\n }\n\n if (blockContent) return md.link(title, blockContent.url);\n }\n break;\n\n case \"table\": {\n const { id, has_children } = block;\n let tableArr: string[][] = [];\n if (has_children) {\n const tableRows = await getBlockChildren(this.notionClient, id, 100);\n // console.log(\">>\", tableRows);\n let rowsPromise = tableRows?.map(async (row) => {\n const { type } = row as any;\n const cells = (row as any)[type][\"cells\"];\n\n /**\n * this is more like a hack since matching the type text was\n * difficult. So converting each cell to paragraph type to\n * reuse the blockToMarkdown function\n */\n let cellStringPromise = cells.map(\n async (cell: any) =>\n await this.blockToMarkdown({\n type: \"paragraph\",\n paragraph: { rich_text: cell },\n } as ListBlockChildrenResponseResult)\n );\n\n const cellStringArr = await Promise.all(cellStringPromise);\n // console.log(\"~~\", cellStringArr);\n tableArr.push(cellStringArr);\n // console.log(tableArr);\n });\n await Promise.all(rowsPromise || []);\n }\n return md.table(tableArr);\n }\n\n // NOTE: column_list is parent of columns\n case \"column_list\": {\n const { id, has_children } = block;\n\n if (!has_children) return \"\";\n\n const column_list_children = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n let column_list_promise = column_list_children.map(\n async (column) => await this.blockToMarkdown(column)\n );\n\n let column_list: string[] = await Promise.all(column_list_promise);\n\n return column_list.join(\"\\n\\n\");\n }\n\n case \"column\": {\n const { id, has_children } = block;\n if (!has_children) return \"\";\n\n const column_children = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n let column_children_mdBlocks = await this.blocksToMarkdown(\n column_children\n );\n\n let column_string = this.toMarkdownString(column_children_mdBlocks);\n\n return column_string;\n }\n\n case \"toggle\": {\n const { id, has_children } = block;\n\n const toggle_summary = block.toggle.rich_text[0]?.plain_text;\n\n // empty toggle\n if (!has_children) {\n return md.toggle(toggle_summary);\n }\n\n const toggle_children_object = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n // parse children blocks to md object\n const toggle_children = await this.blocksToMarkdown(\n toggle_children_object\n );\n\n // convert children md object to md string\n const toggle_children_md_string =\n this.toMarkdownString(toggle_children);\n\n return md.toggle(toggle_summary, toggle_children_md_string);\n }\n // Rest of the types\n // \"paragraph\"\n // \"heading_1\"\n // \"heading_2\"\n // \"heading_3\"\n // \"bulleted_list_item\"\n // \"numbered_list_item\"\n // \"quote\"\n // \"to_do\"\n // \"template\"\n // \"synced_block\"\n // \"child_page\"\n // \"child_database\"\n // \"code\"\n // \"callout\"\n // \"breadcrumb\"\n // \"table_of_contents\"\n // \"column_list\"\n // \"column\"\n // \"link_to_page\"\n // \"audio\"\n // \"unsupported\"\n\n default: {\n // In this case typescript is not able to index the types properly, hence ignoring the error\n // @ts-ignore\n let blockContent = block[type].text || block[type].rich_text || [];\n blockContent.map((content: Text | Equation) => {\n if (content.type === 'equation') {\n parsedData += md.inlineEquation(content.equation.expression);\n return;\n }\n \n const annotations = content.annotations;\n let plain_text = content.plain_text;\n\n plain_text = this.annotatePlainText(plain_text, annotations);\n\n if (content[\"href\"])\n plain_text = md.link(plain_text, content[\"href\"]);\n\n parsedData += plain_text;\n });\n }\n }\n\n switch (type) {\n case \"code\":\n {\n parsedData = md.codeBlock(parsedData, block[type].language);\n }\n break;\n\n case \"heading_1\":\n {\n parsedData = md.heading1(parsedData);\n }\n break;\n\n case \"heading_2\":\n {\n parsedData = md.heading2(parsedData);\n }\n break;\n\n case \"heading_3\":\n {\n parsedData = md.heading3(parsedData);\n }\n break;\n\n case \"quote\":\n {\n parsedData = md.quote(parsedData);\n }\n break;\n\n case \"callout\":\n {\n const { id, has_children } = block;\n let callout_string = \"\";\n\n if (!has_children) {\n return md.callout(parsedData, block[type].icon);\n }\n\n const callout_children_object = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n // // parse children blocks to md object\n const callout_children = await this.blocksToMarkdown(\n callout_children_object\n );\n\n callout_string += `${parsedData}\\n`;\n callout_children.map((child) => {\n callout_string += `${child.parent}\\n\\n`;\n });\n\n parsedData = md.callout(callout_string.trim(), block[type].icon);\n }\n break;\n\n case \"bulleted_list_item\":\n {\n parsedData = md.bullet(parsedData);\n }\n break;\n\n case \"numbered_list_item\":\n {\n parsedData = md.bullet(parsedData, block.numbered_list_item.number);\n }\n break;\n\n case \"to_do\":\n {\n parsedData = md.todo(parsedData, block.to_do.checked);\n }\n break;\n }\n\n return parsedData;\n }\n\n /**\n * Annoate text using provided annotations\n * @param {string} text - String to be annotated\n * @param {Annotations} annotations - Annotation object of a notion block\n * @returns {string} - Annotated text\n */\n annotatePlainText(text: string, annotations: Annotations): string {\n // if text is all spaces, don't annotate\n if (text.match(/^\\s*$/)) return text;\n\n const leadingSpaceMatch = text.match(/^(\\s*)/);\n const trailingSpaceMatch = text.match(/(\\s*)$/);\n\n const leading_space = leadingSpaceMatch ? leadingSpaceMatch[0] : \"\";\n const trailing_space = trailingSpaceMatch ? trailingSpaceMatch[0] : \"\";\n\n text = text.trim();\n\n if (text !== \"\") {\n if (annotations.code) text = md.inlineCode(text);\n if (annotations.bold) text = md.bold(text);\n if (annotations.italic) text = md.italic(text);\n if (annotations.strikethrough) text = md.strikethrough(text);\n if (annotations.underline) text = md.underline(text);\n }\n\n return leading_space + text + trailing_space;\n }\n}\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\";\nimport { ensureFile, writeFile } from \"fs-extra\";\nimport * as path from \"path\";\n\nimport {\n Annotations,\n CustomTransformer,\n ListBlockChildrenResponseResult,\n ListBlockChildrenResponseResults,\n MdBlock,\n NotionToMarkdownOptions,\n Equation,\n Text,\n ConfigurationOptions,\n} from \"./types\";\nimport * as md from \"./utils/md\";\nimport { getBlockChildren } from \"./utils/notion\";\nimport { extractTitleFromMdLink } from \"./utils/misc\";\n\n/**\n * Converts a Notion page to Markdown.\n */\nexport class NotionToMarkdown {\n private notionClient: Client;\n private config: ConfigurationOptions;\n private targetPage: string;\n private customTransformers: Record<string, CustomTransformer>;\n\n constructor(options: NotionToMarkdownOptions) {\n this.notionClient = options.notionClient;\n const defaultConfig: ConfigurationOptions = {\n saveChildPage: false,\n saveToDir: \".\",\n };\n this.targetPage = \"\";\n this.config = { ...defaultConfig, ...options.config };\n this.customTransformers = {};\n }\n\n setCustomTransformer(\n type: string,\n transformer: CustomTransformer\n ): NotionToMarkdown {\n this.customTransformers[type] = transformer;\n\n return this;\n }\n\n /**\n * Converts Markdown Blocks to string\n * @param {MdBlock[]} mdBlocks - Array of markdown blocks\n * @param {number} nestingLevel - Defines max depth of nesting\n * @returns {string} - Returns markdown string\n */\n toMarkdownString(\n mdBlocks: MdBlock[] = [],\n pageName?: string,\n nestingLevel: number = 0\n ): string {\n let mdString = \"\";\n mdBlocks.forEach((mdBlocks) => {\n // NOTE: toggle in the child blocks logic\n // adding a toggle check prevents duplicate\n // rendering of toggle title\n\n // process parent blocks\n if (mdBlocks.parent && mdBlocks.type !== \"toggle\") {\n if (\n mdBlocks.type !== \"to_do\" &&\n mdBlocks.type !== \"bulleted_list_item\" &&\n mdBlocks.type !== \"numbered_list_item\"\n ) {\n // add extra line breaks non list blocks\n mdString += `\\n${md.addTabSpace(mdBlocks.parent, nestingLevel)}\\n\\n`;\n } else {\n mdString += `${md.addTabSpace(mdBlocks.parent, nestingLevel)}\\n`;\n }\n }\n\n // process child blocks\n if (mdBlocks.children && mdBlocks.children.length > 0) {\n if (\n mdBlocks.type === \"synced_block\" ||\n mdBlocks.type === \"column_list\" ||\n mdBlocks.type === \"column\"\n ) {\n let mdstr = this.toMarkdownString(mdBlocks.children);\n mdString += mdstr;\n } else if (mdBlocks.type === \"child_page\") {\n let mdstr = this.toMarkdownString(mdBlocks.children);\n\n if (this.config.saveChildPage && this.config.saveToDir) {\n const childPageTitle = extractTitleFromMdLink(mdBlocks.parent);\n\n const fileName = childPageTitle.split(\" \").join(\"-\");\n const filePath = path.join(this.config.saveToDir, `${fileName}.md`);\n\n // save to file\n ensureFile(filePath).then(() => {\n writeFile(filePath, mdstr);\n });\n } else {\n mdString += mdstr;\n }\n } else if (mdBlocks.type === \"toggle\") {\n // convert children md object to md string\n const toggle_children_md_string = this.toMarkdownString(\n mdBlocks.children\n );\n\n mdString += md.toggle(mdBlocks.parent, toggle_children_md_string);\n } else {\n let mdstr = this.toMarkdownString(\n mdBlocks.children,\n pageName,\n nestingLevel + 1\n );\n mdString += mdstr;\n }\n }\n });\n\n return mdString;\n }\n\n /**\n * Retrieves Notion Blocks based on ID and converts them to Markdown Blocks\n * @param {string} id - notion page id (not database id)\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100 (Default=null)\n * @returns {Promise<MdBlock[]>} - List of markdown blocks\n */\n async pageToMarkdown(\n id: string,\n totalPage: number | null = null\n ): Promise<MdBlock[]> {\n if (!this.notionClient) {\n throw new Error(\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\n );\n }\n this.targetPage = id;\n const blocks = await getBlockChildren(this.notionClient, id, totalPage);\n\n const parsedData = await this.blocksToMarkdown(blocks);\n\n return parsedData;\n }\n\n /**\n * Converts list of Notion Blocks to Markdown Blocks\n * @param {ListBlockChildrenResponseResults | undefined} blocks - List of notion blocks\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100\n * @param {MdBlock[]} mdBlocks - Defines max depth of nesting\n * @returns {Promise<MdBlock[]>} - Array of markdown blocks with their children\n */\n async blocksToMarkdown(\n blocks?: ListBlockChildrenResponseResults,\n totalPage: number | null = null,\n mdBlocks: MdBlock[] = []\n ): Promise<MdBlock[]> {\n if (!this.notionClient) {\n throw new Error(\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\n );\n }\n\n if (!blocks) return mdBlocks;\n\n for (let i = 0; i < blocks.length; i++) {\n let block = blocks[i];\n\n if (\"has_children\" in block && block.has_children) {\n // Get children of this block.\n let child_blocks = await getBlockChildren(\n this.notionClient,\n block.id,\n totalPage\n );\n\n // Push this block to mdBlocks.\n mdBlocks.push({\n type: block.type,\n blockId: block.id,\n parent: await this.blockToMarkdown(block),\n children: [],\n });\n\n // Recursively call blocksToMarkdown to get children of this block.\n let l = mdBlocks.length;\n await this.blocksToMarkdown(\n child_blocks,\n totalPage,\n mdBlocks[l - 1].children\n );\n continue;\n }\n\n let tmp = await this.blockToMarkdown(block);\n mdBlocks.push({\n // @ts-ignore\n type: block.type,\n blockId: block.id,\n parent: tmp,\n children: [],\n });\n }\n return mdBlocks;\n }\n\n /**\n * Converts a Notion Block to a Markdown Block\n * @param {ListBlockChildrenResponseResult} block - single notion block\n * @returns {string} corresponding markdown string of the passed block\n */\n async blockToMarkdown(block: ListBlockChildrenResponseResult) {\n if (typeof block !== \"object\" || !(\"type\" in block)) return \"\";\n\n let parsedData = \"\";\n const { type } = block;\n if (type in this.customTransformers && !!this.customTransformers[type]) {\n const customTransformerValue = await this.customTransformers[type](block);\n if (!!customTransformerValue || customTransformerValue === \"\")\n return customTransformerValue;\n }\n\n switch (type) {\n case \"image\":\n {\n let blockContent = block.image;\n\n const image_caption_plain = blockContent.caption\n .map((item: any) => item.plain_text)\n .join(\"\");\n\n const image_type = blockContent.type;\n\n if (image_type === \"external\")\n return md.image(image_caption_plain, blockContent.external.url);\n\n if (image_type === \"file\")\n return md.image(image_caption_plain, blockContent.file.url);\n }\n break;\n\n case \"divider\": {\n return md.divider();\n }\n\n case \"equation\": {\n return md.equation(block.equation.expression);\n }\n\n case \"video\":\n case \"file\":\n case \"pdf\":\n {\n let blockContent;\n if (type === \"video\") blockContent = block.video;\n if (type === \"file\") blockContent = block.file;\n if (type === \"pdf\") blockContent = block.pdf;\n if (blockContent) {\n const file_type = blockContent.type;\n if (file_type === \"external\")\n return md.link(\"image\", blockContent.external.url);\n if (file_type === \"file\")\n return md.link(\"image\", blockContent.file.url);\n }\n }\n break;\n\n case \"bookmark\":\n case \"embed\":\n case \"link_preview\":\n case \"link_to_page\":\n {\n let blockContent;\n let title: string = type;\n if (type === \"bookmark\") blockContent = block.bookmark;\n if (type === \"embed\") blockContent = block.embed;\n if (type === \"link_preview\") blockContent = block.link_preview;\n if (\n type === \"link_to_page\" &&\n block.link_to_page.type === \"page_id\"\n ) {\n blockContent = { url: block.link_to_page.page_id };\n }\n\n if (blockContent) return md.link(title, blockContent.url);\n }\n break;\n\n case \"child_page\":\n {\n let pageTitle: string = block.child_page.title;\n\n if (this.config.saveChildPage) {\n const fileName = pageTitle.split(\" \").join(\"-\");\n const filePath = `${fileName}.md`;\n return md.link(pageTitle, filePath);\n }\n\n return md.heading2(pageTitle);\n }\n break;\n case \"child_database\":\n {\n let pageTitle = block.child_database.title || `child_database`;\n return pageTitle;\n }\n break;\n\n case \"table\": {\n const { id, has_children } = block;\n let tableArr: string[][] = [];\n if (has_children) {\n const tableRows = await getBlockChildren(this.notionClient, id, 100);\n let rowsPromise = tableRows?.map(async (row) => {\n const { type } = row as any;\n const cells = (row as any)[type][\"cells\"];\n\n /**\n * this is more like a hack since matching the type text was\n * difficult. So converting each cell to paragraph type to\n * reuse the blockToMarkdown function\n */\n let cellStringPromise = cells.map(\n async (cell: any) =>\n await this.blockToMarkdown({\n type: \"paragraph\",\n paragraph: { rich_text: cell },\n } as ListBlockChildrenResponseResult)\n );\n\n const cellStringArr = await Promise.all(cellStringPromise);\n tableArr.push(cellStringArr);\n });\n await Promise.all(rowsPromise || []);\n }\n return md.table(tableArr);\n }\n // Rest of the types\n // \"paragraph\"\n // \"heading_1\"\n // \"heading_2\"\n // \"heading_3\"\n // \"bulleted_list_item\"\n // \"numbered_list_item\"\n // \"quote\"\n // \"to_do\"\n // \"template\"\n // \"synced_block\"\n // \"child_page\"\n // \"child_database\"\n // \"code\"\n // \"callout\"\n // \"breadcrumb\"\n // \"table_of_contents\"\n // \"link_to_page\"\n // \"audio\"\n // \"unsupported\"\n\n default: {\n // In this case typescript is not able to index the types properly, hence ignoring the error\n // @ts-ignore\n let blockContent = block[type].text || block[type].rich_text || [];\n blockContent.map((content: Text | Equation) => {\n if (content.type === \"equation\") {\n parsedData += md.inlineEquation(content.equation.expression);\n return;\n }\n\n const annotations = content.annotations;\n let plain_text = content.plain_text;\n\n plain_text = this.annotatePlainText(plain_text, annotations);\n\n if (content[\"href\"])\n plain_text = md.link(plain_text, content[\"href\"]);\n\n parsedData += plain_text;\n });\n }\n }\n\n switch (type) {\n case \"code\":\n {\n parsedData = md.codeBlock(parsedData, block[type].language);\n }\n break;\n\n case \"heading_1\":\n {\n parsedData = md.heading1(parsedData);\n }\n break;\n\n case \"heading_2\":\n {\n parsedData = md.heading2(parsedData);\n }\n break;\n\n case \"heading_3\":\n {\n parsedData = md.heading3(parsedData);\n }\n break;\n\n case \"quote\":\n {\n parsedData = md.quote(parsedData);\n }\n break;\n\n case \"callout\":\n {\n const { id, has_children } = block;\n let callout_string = \"\";\n\n if (!has_children) {\n return md.callout(parsedData, block[type].icon);\n }\n\n const callout_children_object = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n // // parse children blocks to md object\n const callout_children = await this.blocksToMarkdown(\n callout_children_object\n );\n\n callout_string += `${parsedData}\\n`;\n callout_children.map((child) => {\n callout_string += `${child.parent}\\n\\n`;\n });\n\n parsedData = md.callout(callout_string.trim(), block[type].icon);\n }\n break;\n\n case \"bulleted_list_item\":\n {\n parsedData = md.bullet(parsedData);\n }\n break;\n\n case \"numbered_list_item\":\n {\n parsedData = md.bullet(parsedData, block.numbered_list_item.number);\n }\n break;\n\n case \"to_do\":\n {\n parsedData = md.todo(parsedData, block.to_do.checked);\n }\n break;\n }\n\n return parsedData;\n }\n\n /**\n * Annoate text using provided annotations\n * @param {string} text - String to be annotated\n * @param {Annotations} annotations - Annotation object of a notion block\n * @returns {string} - Annotated text\n */\n annotatePlainText(text: string, annotations: Annotations): string {\n // if text is all spaces, don't annotate\n if (text.match(/^\\s*$/)) return text;\n\n const leadingSpaceMatch = text.match(/^(\\s*)/);\n const trailingSpaceMatch = text.match(/(\\s*)$/);\n\n const leading_space = leadingSpaceMatch ? leadingSpaceMatch[0] : \"\";\n const trailing_space = trailingSpaceMatch ? trailingSpaceMatch[0] : \"\";\n\n text = text.trim();\n\n if (text !== \"\") {\n if (annotations.code) text = md.inlineCode(text);\n if (annotations.bold) text = md.bold(text);\n if (annotations.italic) text = md.italic(text);\n if (annotations.strikethrough) text = md.strikethrough(text);\n if (annotations.underline) text = md.underline(text);\n }\n\n return leading_space + text + trailing_space;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { Client } from '@notionhq/client';
2
- import { ListBlockChildrenResponse } from '@notionhq/client/build/src/api-endpoints';
1
+ import { Client } from "@notionhq/client";
2
+ import { ListBlockChildrenResponse } from "@notionhq/client/build/src/api-endpoints";
3
3
  export type BlockAttributes = {
4
4
  numbered_list_item?: {
5
5
  number?: number;
@@ -8,8 +8,13 @@ export type BlockAttributes = {
8
8
  export type ListBlockChildrenResponseResults = ListBlockChildrenResponse["results"] & BlockAttributes;
9
9
  export type ListBlockChildrenResponseResult = ListBlockChildrenResponseResults[0] & BlockAttributes;
10
10
  export type TextRequest = string;
11
+ export type ConfigurationOptions = {
12
+ saveToDir?: string;
13
+ saveChildPage?: boolean;
14
+ };
11
15
  export interface NotionToMarkdownOptions {
12
16
  notionClient: Client;
17
+ config?: ConfigurationOptions;
13
18
  }
14
19
  export type MdBlock = {
15
20
  type?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EACL,yBAAyB,EAC1B,MAAM,0CAA0C,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG;IAC5B,kBAAkB,CAAC,EAAE;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AACF,MAAM,MAAM,gCAAgC,GAC1C,yBAAyB,CAAC,SAAS,CAAC,GAAG,eAAe,CAAC;AAEzD,MAAM,MAAM,+BAA+B,GACzC,gCAAgC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,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,EACH,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;CACpB,CAAC;AAEF,MAAM,MAAM,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,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,EAAE;QACX,IAAI,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,KAAK,CAAC;QACd,aAAa,EAAE,KAAK,CAAC;QACrB,SAAS,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,SAAS,CAAC;KAClB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,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;AAET,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,+BAA+B,KACnC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { Client } from '@notionhq/client';\nimport {\n ListBlockChildrenResponse,\n} from '@notionhq/client/build/src/api-endpoints';\n\nexport type BlockAttributes = {\n numbered_list_item?: {\n number?: number;\n };\n};\nexport type ListBlockChildrenResponseResults =\n ListBlockChildrenResponse[\"results\"] & BlockAttributes;\n\nexport type ListBlockChildrenResponseResult =\n ListBlockChildrenResponseResults[0] & BlockAttributes;\n\nexport type TextRequest = string;\n\nexport interface NotionToMarkdownOptions {\n notionClient: Client;\n}\n\nexport type MdBlock = {\n type?: string;\n blockId: string;\n parent: string;\n children: MdBlock[];\n};\n\nexport type Annotations = {\n bold: boolean;\n italic: boolean;\n strikethrough: boolean;\n underline: boolean;\n code: boolean;\n color:\n | \"default\"\n | \"gray\"\n | \"brown\"\n | \"orange\"\n | \"yellow\"\n | \"green\"\n | \"blue\"\n | \"purple\"\n | \"pink\"\n | \"red\"\n | \"gray_background\"\n | \"brown_background\"\n | \"orange_background\"\n | \"yellow_background\"\n | \"green_background\"\n | \"blue_background\"\n | \"purple_background\"\n | \"pink_background\"\n | \"red_background\";\n};\n\nexport type Text = {\n type: \"text\";\n text: {\n content: string;\n link: {\n url: TextRequest;\n } | null;\n };\n annotations: Annotations;\n plain_text: string;\n href: string | null;\n};\n\nexport type Equation = {\n type: \"equation\";\n equation: { \n expression: string;\n },\n annotations: {\n bold: false;\n italic: false;\n strikethrough: false;\n underline: false;\n code: false;\n color: \"default\";\n },\n plain_text: string;\n href: null;\n};\n\nexport type CalloutIcon =\n | { type: \"emoji\"; emoji?: string }\n | { type: \"external\"; external?: { url: string } }\n | { type: \"file\"; file: { url: string; expiry_time: string } }\n | null;\n\nexport type CustomTransformer = (\n block: ListBlockChildrenResponseResult\n) => string | Promise<string>;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { Client } from \"@notionhq/client\";\nimport { ListBlockChildrenResponse } from \"@notionhq/client/build/src/api-endpoints\";\n\nexport type BlockAttributes = {\n numbered_list_item?: {\n number?: number;\n };\n};\nexport type ListBlockChildrenResponseResults =\n ListBlockChildrenResponse[\"results\"] & BlockAttributes;\n\nexport type ListBlockChildrenResponseResult =\n ListBlockChildrenResponseResults[0] & BlockAttributes;\n\nexport type TextRequest = string;\n\nexport type ConfigurationOptions = {\n saveToDir?: string;\n saveChildPage?: boolean;\n};\nexport interface NotionToMarkdownOptions {\n notionClient: Client;\n config?: ConfigurationOptions;\n}\n\nexport type MdBlock = {\n type?: string;\n blockId: string;\n parent: string;\n children: MdBlock[];\n};\n\nexport type Annotations = {\n bold: boolean;\n italic: boolean;\n strikethrough: boolean;\n underline: boolean;\n code: boolean;\n color:\n | \"default\"\n | \"gray\"\n | \"brown\"\n | \"orange\"\n | \"yellow\"\n | \"green\"\n | \"blue\"\n | \"purple\"\n | \"pink\"\n | \"red\"\n | \"gray_background\"\n | \"brown_background\"\n | \"orange_background\"\n | \"yellow_background\"\n | \"green_background\"\n | \"blue_background\"\n | \"purple_background\"\n | \"pink_background\"\n | \"red_background\";\n};\n\nexport type Text = {\n type: \"text\";\n text: {\n content: string;\n link: {\n url: TextRequest;\n } | null;\n };\n annotations: Annotations;\n plain_text: string;\n href: string | null;\n};\n\nexport type Equation = {\n type: \"equation\";\n equation: {\n expression: string;\n };\n annotations: {\n bold: false;\n italic: false;\n strikethrough: false;\n underline: false;\n code: false;\n color: \"default\";\n };\n plain_text: string;\n href: null;\n};\n\nexport type CalloutIcon =\n | { type: \"emoji\"; emoji?: string }\n | { type: \"external\"; external?: { url: string } }\n | { type: \"file\"; file: { url: string; expiry_time: string } }\n | null;\n\nexport type CustomTransformer = (\n block: ListBlockChildrenResponseResult\n) => string | Promise<string>;\n"]}
package/build/utils/md.js CHANGED
@@ -90,7 +90,7 @@ const addTabSpace = (text, n = 0) => {
90
90
  const tab = " ";
91
91
  for (let i = 0; i < n; i++) {
92
92
  if (text.includes("\n")) {
93
- const multiLineText = text.split(/(?<=\n)/).join(tab);
93
+ const multiLineText = text.split(/(?:^|\n)/).join(`\n${tab}`);
94
94
  text = tab + multiLineText;
95
95
  }
96
96
  else
@@ -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\";\nimport markdownTable from \"markdown-table\";\n\nexport const inlineCode = (text: string) => {\n return `\\`${text}\\``;\n};\n\nexport const inlineEquation = (text: string) => {\n return `$${text}$`;\n};\n\nexport const bold = (text: string) => {\n return `**${text}**`;\n};\n\nexport const italic = (text: string) => {\n return `_${text}_`;\n};\n\nexport const strikethrough = (text: string) => {\n return `~~${text}~~`;\n};\n\nexport const underline = (text: string) => {\n return `<u>${text}</u>`;\n};\n\nexport const link = (text: string, href: string) => {\n return `[${text}](${href})`;\n};\n\nexport const codeBlock = (text: string, language?: string) => {\n if (language === \"plain text\") language = \"text\";\n\n return `\\`\\`\\`${language}\n${text}\n\\`\\`\\``;\n};\n\nexport const equation = (text: string) => {\n return `$$\n${text}\n$$`;\n};\n\nexport const heading1 = (text: string) => {\n return `# ${text}`;\n};\n\nexport const heading2 = (text: string) => {\n return `## ${text}`;\n};\n\nexport const heading3 = (text: string) => {\n return `### ${text}`;\n};\n\nexport const quote = (text: string) => {\n // the replace is done to handle multiple lines\n return `> ${text.replace(/\\n/g, \" \\n> \")}`;\n};\n\nexport const callout = (text: string, icon?: CalloutIcon) => {\n let emoji: string | undefined;\n if (icon?.type === \"emoji\") {\n emoji = icon.emoji;\n }\n\n // the replace is done to handle multiple lines\n return `> ${emoji ? emoji + \" \" : \"\"}${text.replace(/\\n/g, \" \\n> \")}`;\n};\n\nexport const bullet = (text: string, count?: number) => {\n let renderText = text.trim();\n return count ? `${count}. ${renderText}` : `- ${renderText}`;\n};\n\nexport const todo = (text: string, checked: boolean) => {\n return checked ? `- [x] ${text}` : `- [ ] ${text}`;\n};\n\nexport const image = (alt: string, href: string) => {\n return `![${alt}](${href})`;\n};\n\nexport const addTabSpace = (text: string, n = 0) => {\n const tab = \"\t\";\n for (let i = 0; i < n; i++) {\n if (text.includes(\"\\n\")) {\n const multiLineText = text.split(/(?<=\\n)/).join(tab);\n text = tab + multiLineText;\n } else text = tab + text;\n }\n return text;\n};\n\nexport const divider = () => {\n return \"---\";\n};\n\nexport const toggle = (summary?: string, children?: string) => {\n if (!summary) return children || \"\";\n return `<details>\n <summary>${summary}</summary>\n\n${children || \"\"}\n\n </details>`;\n};\n\nexport const table = (cells: string[][]) => {\n return markdownTable(cells);\n};\n"]}
1
+ {"version":3,"file":"md.js","sourceRoot":"","sources":["../../src/utils/md.ts"],"names":[],"mappings":"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","sourcesContent":["import { CalloutIcon } from \"../types\";\nimport markdownTable from \"markdown-table\";\n\nexport const inlineCode = (text: string) => {\n return `\\`${text}\\``;\n};\n\nexport const inlineEquation = (text: string) => {\n return `$${text}$`;\n};\n\nexport const bold = (text: string) => {\n return `**${text}**`;\n};\n\nexport const italic = (text: string) => {\n return `_${text}_`;\n};\n\nexport const strikethrough = (text: string) => {\n return `~~${text}~~`;\n};\n\nexport const underline = (text: string) => {\n return `<u>${text}</u>`;\n};\n\nexport const link = (text: string, href: string) => {\n return `[${text}](${href})`;\n};\n\nexport const codeBlock = (text: string, language?: string) => {\n if (language === \"plain text\") language = \"text\";\n\n return `\\`\\`\\`${language}\n${text}\n\\`\\`\\``;\n};\n\nexport const equation = (text: string) => {\n return `$$\n${text}\n$$`;\n};\n\nexport const heading1 = (text: string) => {\n return `# ${text}`;\n};\n\nexport const heading2 = (text: string) => {\n return `## ${text}`;\n};\n\nexport const heading3 = (text: string) => {\n return `### ${text}`;\n};\n\nexport const quote = (text: string) => {\n // the replace is done to handle multiple lines\n return `> ${text.replace(/\\n/g, \" \\n> \")}`;\n};\n\nexport const callout = (text: string, icon?: CalloutIcon) => {\n let emoji: string | undefined;\n if (icon?.type === \"emoji\") {\n emoji = icon.emoji;\n }\n\n // the replace is done to handle multiple lines\n return `> ${emoji ? emoji + \" \" : \"\"}${text.replace(/\\n/g, \" \\n> \")}`;\n};\n\nexport const bullet = (text: string, count?: number) => {\n let renderText = text.trim();\n return count ? `${count}. ${renderText}` : `- ${renderText}`;\n};\n\nexport const todo = (text: string, checked: boolean) => {\n return checked ? `- [x] ${text}` : `- [ ] ${text}`;\n};\n\nexport const image = (alt: string, href: string) => {\n return `![${alt}](${href})`;\n};\n\nexport const addTabSpace = (text: string, n = 0) => {\n const tab = \"\t\";\n for (let i = 0; i < n; i++) {\n if (text.includes(\"\\n\")) {\n const multiLineText = text.split(/(?:^|\\n)/).join(`\\n${tab}`);\n text = tab + multiLineText;\n } else text = tab + text;\n }\n return text;\n};\n\nexport const divider = () => {\n return \"---\";\n};\n\nexport const toggle = (summary?: string, children?: string) => {\n if (!summary) return children || \"\";\n return `<details>\n <summary>${summary}</summary>\n\n${children || \"\"}\n\n </details>`;\n};\n\nexport const table = (cells: string[][]) => {\n return markdownTable(cells);\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const extractTitleFromMdLink: (mdLink: string) => string;
2
+ //# sourceMappingURL=misc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,WAAY,MAAM,WAIpD,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractTitleFromMdLink = void 0;
4
+ const extractTitleFromMdLink = (mdLink) => {
5
+ const regex = /\[(.*?)\]/;
6
+ const match = regex.exec(mdLink);
7
+ return match ? match[1] : "";
8
+ };
9
+ exports.extractTitleFromMdLink = extractTitleFromMdLink;
10
+ //# sourceMappingURL=misc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":";;;AAAO,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE;IACvD,MAAM,KAAK,GAAG,WAAW,CAAC;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC,CAAC;AAJW,QAAA,sBAAsB,0BAIjC","sourcesContent":["export const extractTitleFromMdLink = (mdLink: string) => {\n const regex = /\\[(.*?)\\]/;\n const match = regex.exec(mdLink);\n return match ? match[1] : \"\";\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"notion.d.ts","sourceRoot":"","sources":["../../src/utils/notion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAE5D,eAAO,MAAM,gBAAgB,iBACb,MAAM,YACV,MAAM,aACL,MAAM,GAAG,IAAI,8CA2BzB,CAAC;AAEF,eAAO,MAAM,wBAAwB,WAC3B,gCAAgC,SAczC,CAAC"}
1
+ {"version":3,"file":"notion.d.ts","sourceRoot":"","sources":["../../src/utils/notion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAE5D,eAAO,MAAM,gBAAgB,iBACb,MAAM,YACV,MAAM,aACL,MAAM,GAAG,IAAI,8CA2BzB,CAAC;AAEF,eAAO,MAAM,wBAAwB,WAC3B,gCAAgC,SAazC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"notion.js","sourceRoot":"","sources":["../../src/utils/notion.ts"],"names":[],"mappings":";;;AAIO,MAAM,gBAAgB,GAAG,KAAK,EACnC,YAAoB,EACpB,QAAgB,EAChB,SAAwB,EACxB,EAAE;IACF,IAAI;QACF,IAAI,MAAM,GAAqC,EAAE,CAAC;QAClD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,YAAY,GAAG,SAAS,CAAC;QAE7B,GAAG;YACD,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxD,YAAY,EAAE,YAAY;gBAC1B,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAA8B,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEjC,YAAY,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,CAAC;YACrC,SAAS,IAAI,CAAC,CAAC;SAChB,QACC,YAAY,IAAI,IAAI;YACpB,CAAC,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,SAAS,CAAC,EAC5C;QAEF,IAAA,gCAAwB,EAAC,MAAM,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC;KACf;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,EAAE,CAAC;KACX;AACH,CAAC,CAAC;AA9BW,QAAA,gBAAgB,oBA8B3B;AAEK,MAAM,wBAAwB,GAAG,CACtC,MAAwC,EACxC,EAAE;IACF,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE;YAC1D,cAAc;YACd,aAAa;YACb,KAAK,CAAC,kBAAkB,CAAC,MAAM,GAAG,EAAE,iBAAiB,CAAC;SACvD;aACI;YACH,iBAAiB,GAAG,CAAC,CAAC;SACvB;KACF;AACH,CAAC,CAAC;AAfW,QAAA,wBAAwB,4BAenC","sourcesContent":["import { Client } from \"@notionhq/client\";\nimport { ListBlockChildrenResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { ListBlockChildrenResponseResults } from \"../types\";\n\nexport const getBlockChildren = async (\n notionClient: Client,\n block_id: string,\n totalPage: number | null\n) => {\n try {\n let result: ListBlockChildrenResponseResults = [];\n let pageCount = 0;\n let start_cursor = undefined;\n\n do {\n const response = (await notionClient.blocks.children.list({\n start_cursor: start_cursor,\n block_id: block_id,\n })) as ListBlockChildrenResponse;\n result.push(...response.results);\n\n start_cursor = response?.next_cursor;\n pageCount += 1;\n } while (\n start_cursor != null &&\n (totalPage == null || pageCount < totalPage)\n );\n\n modifyNumberedListObject(result);\n return result;\n } catch (e) {\n console.log(e);\n return [];\n }\n};\n\nexport const modifyNumberedListObject = (\n blocks: ListBlockChildrenResponseResults\n) => {\n let numberedListIndex = 0;\n\n for (const block of blocks) {\n if (\"type\" in block && block.type === \"numbered_list_item\") {\n // add numbers\n // @ts-ignore\n block.numbered_list_item.number = ++numberedListIndex;\n }\n else {\n numberedListIndex = 0;\n }\n }\n};\n"]}
1
+ {"version":3,"file":"notion.js","sourceRoot":"","sources":["../../src/utils/notion.ts"],"names":[],"mappings":";;;AAIO,MAAM,gBAAgB,GAAG,KAAK,EACnC,YAAoB,EACpB,QAAgB,EAChB,SAAwB,EACxB,EAAE;IACF,IAAI;QACF,IAAI,MAAM,GAAqC,EAAE,CAAC;QAClD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,YAAY,GAAG,SAAS,CAAC;QAE7B,GAAG;YACD,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxD,YAAY,EAAE,YAAY;gBAC1B,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAA8B,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEjC,YAAY,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,CAAC;YACrC,SAAS,IAAI,CAAC,CAAC;SAChB,QACC,YAAY,IAAI,IAAI;YACpB,CAAC,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,SAAS,CAAC,EAC5C;QAEF,IAAA,gCAAwB,EAAC,MAAM,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC;KACf;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,EAAE,CAAC;KACX;AACH,CAAC,CAAC;AA9BW,QAAA,gBAAgB,oBA8B3B;AAEK,MAAM,wBAAwB,GAAG,CACtC,MAAwC,EACxC,EAAE;IACF,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE;YAC1D,cAAc;YACd,aAAa;YACb,KAAK,CAAC,kBAAkB,CAAC,MAAM,GAAG,EAAE,iBAAiB,CAAC;SACvD;aAAM;YACL,iBAAiB,GAAG,CAAC,CAAC;SACvB;KACF;AACH,CAAC,CAAC;AAdW,QAAA,wBAAwB,4BAcnC","sourcesContent":["import { Client } from \"@notionhq/client\";\nimport { ListBlockChildrenResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { ListBlockChildrenResponseResults } from \"../types\";\n\nexport const getBlockChildren = async (\n notionClient: Client,\n block_id: string,\n totalPage: number | null\n) => {\n try {\n let result: ListBlockChildrenResponseResults = [];\n let pageCount = 0;\n let start_cursor = undefined;\n\n do {\n const response = (await notionClient.blocks.children.list({\n start_cursor: start_cursor,\n block_id: block_id,\n })) as ListBlockChildrenResponse;\n result.push(...response.results);\n\n start_cursor = response?.next_cursor;\n pageCount += 1;\n } while (\n start_cursor != null &&\n (totalPage == null || pageCount < totalPage)\n );\n\n modifyNumberedListObject(result);\n return result;\n } catch (e) {\n console.log(e);\n return [];\n }\n};\n\nexport const modifyNumberedListObject = (\n blocks: ListBlockChildrenResponseResults\n) => {\n let numberedListIndex = 0;\n\n for (const block of blocks) {\n if (\"type\" in block && block.type === \"numbered_list_item\") {\n // add numbers\n // @ts-ignore\n block.numbered_list_item.number = ++numberedListIndex;\n } else {\n numberedListIndex = 0;\n }\n }\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "notion-to-md",
3
- "version": "2.5.6",
3
+ "version": "2.6.0",
4
4
  "engines": {
5
5
  "node": ">=12"
6
6
  },
@@ -39,6 +39,7 @@
39
39
  "description": "convert notion pages, block and list of blocks to markdown (supports nesting)",
40
40
  "devDependencies": {
41
41
  "@notionhq/client": "^1.0.1",
42
+ "@types/fs-extra": "^11.0.1",
42
43
  "@types/jest": "^27.4.1",
43
44
  "@types/markdown-table": "^2.0.0",
44
45
  "jest": "^27.4.7",
@@ -46,6 +47,7 @@
46
47
  "typescript": "^4.5.4"
47
48
  },
48
49
  "dependencies": {
50
+ "fs-extra": "^11.1.1",
49
51
  "markdown-table": "^2.0.0"
50
52
  }
51
53
  }