notion-to-md 3.1.8 → 3.1.10
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 +31 -11
- package/build/notion-to-md.d.ts +1 -1
- package/build/notion-to-md.d.ts.map +1 -1
- package/build/notion-to-md.js +24 -6
- package/build/notion-to-md.js.map +1 -1
- package/build/notion-to-md.spec.js +174 -0
- package/build/notion-to-md.spec.js.map +1 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/index.js.map +1 -1
- package/build/utils/md.d.ts +2 -0
- package/build/utils/md.d.ts.map +1 -1
- package/build/utils/md.js +40 -6
- package/build/utils/md.js.map +1 -1
- package/build/utils/md.spec.js +54 -0
- package/build/utils/md.spec.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -13,21 +13,15 @@
|
|
|
13
13
|
<br>
|
|
14
14
|
</h1>
|
|
15
15
|
|
|
16
|
-
<div align="center">
|
|
17
|
-
<a href="https://notionconvert.com/
|
|
18
|
-
<img src="https://i.ibb.co/
|
|
16
|
+
<div align="center" style="display: flex; justify-content: center; align-items: center; gap: 20px; flex-wrap: wrap; margin: 20px 0;">
|
|
17
|
+
<a href="https://notionconvert.com/docs/v4/getting-started?utm_source=github.com&utm_medium=readme">
|
|
18
|
+
<img src="https://i.ibb.co/WW9zvyhD/Group-98.png" height="50" style="border-radius: 8px; object-fit: contain;" />
|
|
19
19
|
</a>
|
|
20
|
-
</div>
|
|
21
|
-
|
|
22
|
-
<div align="center">
|
|
23
20
|
<a href="https://discord.gg/drWw5Ya535">
|
|
24
|
-
<img src="https://i.ibb.co/
|
|
21
|
+
<img src="https://i.ibb.co/nsdt7ZV3/Group-99.png" width="140" height="50" style="border-radius: 8px; object-fit: contain;" />
|
|
25
22
|
</a>
|
|
26
|
-
</div>
|
|
27
|
-
|
|
28
|
-
<div align="center">
|
|
29
23
|
<a href="https://www.reddit.com/r/notion_to_md/">
|
|
30
|
-
<img src="https://i.ibb.co/
|
|
24
|
+
<img src="https://i.ibb.co/1Gm9ztvy/Group-87.png" width="140" height="50" style="border-radius: 8px; object-fit: contain;" />
|
|
31
25
|
</a>
|
|
32
26
|
</div>
|
|
33
27
|
|
|
@@ -43,9 +37,16 @@
|
|
|
43
37
|
<img src="https://komarev.com/ghpvc/?username=notion-to-md&abbreviated=true&label=REPO+VIEWS" alt="repo views" />
|
|
44
38
|
</p>
|
|
45
39
|
|
|
40
|
+
## Sponsored
|
|
41
|
+
[](https://gitads.dev/v1/ad-track?source=souvikinator/notion-to-md@github)
|
|
42
|
+
|
|
43
|
+
> [!NOTE]
|
|
44
|
+
> Looking to contribute to v4? Here is the [v4 branch](https://github.com/souvikinator/notion-to-md/tree/v4.0.0-alpha/)
|
|
45
|
+
|
|
46
46
|
## 🗒️ Recent posts
|
|
47
47
|
|
|
48
48
|
<!-- feed start -->
|
|
49
|
+
- Apr 23 - [Mastering Media Handling in notion-to-md v4 - Download, Upload, and Direct Strategies](https://notionconvert.com/blog/mastering-media-handling-in-notion-to-md-v4/)
|
|
49
50
|
- Mar 12 - [How to Convert Notion Properties to Frontmatter with notion-to-md v4](https://notionconvert.com/blog/how-to-convert-notion-properties-to-frontmatter/)
|
|
50
51
|
- Mar 12 - [How to Handle Documents in Notion Using notion-to-md v4](https://notionconvert.com/blog/how-to-handle-documents-in-notion-using-notion-to-md-v4/)
|
|
51
52
|
- Mar 11 - [How to Convert Notion Comments to Markdown Footnotes with notion-to-md v4](https://notionconvert.com/blog/how-to-use-notion-comments-as-footnotes-in-markdown/)
|
|
@@ -160,6 +161,23 @@ const n2m = new NotionToMarkdown({
|
|
|
160
161
|
...
|
|
161
162
|
```
|
|
162
163
|
|
|
164
|
+
## Escape Markdown characters in plain text
|
|
165
|
+
|
|
166
|
+
By default, plain text from Notion is written as-is, so text such as `2*3*4`, `# not a heading` or `1. not a list` is interpreted as Markdown formatting. Enable `escapeMarkdown` to backslash-escape Markdown syntax in non-code text so it renders literally:
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
...
|
|
170
|
+
|
|
171
|
+
const n2m = new NotionToMarkdown({
|
|
172
|
+
notionClient: notion,
|
|
173
|
+
config:{
|
|
174
|
+
escapeMarkdown:true, // default: false
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
...
|
|
179
|
+
```
|
|
180
|
+
|
|
163
181
|
## converting page to markdown object
|
|
164
182
|
|
|
165
183
|
**Example notion page:**
|
|
@@ -329,3 +347,5 @@ Please make sure to update tests as appropriate.
|
|
|
329
347
|
## License
|
|
330
348
|
|
|
331
349
|
[MIT](https://choosealicense.com/licenses/mit/)
|
|
350
|
+
|
|
351
|
+
<!-- GitAds-Verify: BBBJJTN2GTIQDDAIVDL4L5TCLZMOE84C -->
|
package/build/notion-to-md.d.ts
CHANGED
|
@@ -42,6 +42,6 @@ export declare class NotionToMarkdown {
|
|
|
42
42
|
* @param {Annotations} annotations - Annotation object of a notion block
|
|
43
43
|
* @returns {string} - Annotated text
|
|
44
44
|
*/
|
|
45
|
-
annotatePlainText(text: string, annotations: Annotations): string;
|
|
45
|
+
annotatePlainText(text: string, annotations: Annotations, escape?: ((text: string) => string) | undefined): string;
|
|
46
46
|
}
|
|
47
47
|
//# sourceMappingURL=notion-to-md.d.ts.map
|
|
@@ -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,EAIvB,cAAc,EACd,SAAS,EACV,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,kBAAkB,CAAoC;gBAElD,OAAO,EAAE,uBAAuB;
|
|
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,EAIvB,cAAc,EACd,SAAS,EACV,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,kBAAkB,CAAoC;gBAElD,OAAO,EAAE,uBAAuB;IAY5C,oBAAoB,CAClB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,iBAAiB,GAC7B,gBAAgB;IAMnB;;;;;OAKG;IACH,gBAAgB,CACd,QAAQ,GAAE,OAAO,EAAO,EACxB,cAAc,GAAE,MAAiB,EACjC,YAAY,GAAE,MAAU,GACvB,cAAc;IA8HjB;;;;;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;IAyErB;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,+BAA+B;IAoT5D;;;;;OAKG;IACH,iBAAiB,CACf,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,WAAW,EACxB,MAAM,GAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAGxB,GACZ,MAAM;CAuBV"}
|
package/build/notion-to-md.js
CHANGED
|
@@ -36,6 +36,7 @@ class NotionToMarkdown {
|
|
|
36
36
|
separateChildPage: false,
|
|
37
37
|
convertImagesToBase64: false,
|
|
38
38
|
parseChildPages: true,
|
|
39
|
+
escapeMarkdown: false,
|
|
39
40
|
};
|
|
40
41
|
this.config = { ...defaultConfig, ...options.config };
|
|
41
42
|
this.customTransformers = {};
|
|
@@ -56,6 +57,7 @@ class NotionToMarkdown {
|
|
|
56
57
|
// NOTE: toggle in the child blocks logic
|
|
57
58
|
// adding a toggle check prevents duplicate
|
|
58
59
|
// rendering of toggle title
|
|
60
|
+
var _a, _b;
|
|
59
61
|
// process parent blocks
|
|
60
62
|
if (mdBlocks.parent &&
|
|
61
63
|
mdBlocks.type !== "toggle" &&
|
|
@@ -114,7 +116,7 @@ class NotionToMarkdown {
|
|
|
114
116
|
}
|
|
115
117
|
else if (mdBlocks.type === "quote") {
|
|
116
118
|
let mdstr = this.toMarkdownString(mdBlocks.children, pageIdentifier, nestingLevel);
|
|
117
|
-
const formattedContent = mdstr.parent
|
|
119
|
+
const formattedContent = ((_b = (_a = mdstr.parent) !== null && _a !== void 0 ? _a : mdstr[pageIdentifier]) !== null && _b !== void 0 ? _b : '')
|
|
118
120
|
.split("\n")
|
|
119
121
|
.map((line) => (line.trim() ? `> ${line}` : ">"))
|
|
120
122
|
.join("\n")
|
|
@@ -173,6 +175,7 @@ class NotionToMarkdown {
|
|
|
173
175
|
}
|
|
174
176
|
if (!blocks)
|
|
175
177
|
return mdBlocks;
|
|
178
|
+
(0, notion_1.modifyNumberedListObject)(blocks);
|
|
176
179
|
for (let i = 0; i < blocks.length; i++) {
|
|
177
180
|
let block = blocks[i];
|
|
178
181
|
if (
|
|
@@ -222,6 +225,7 @@ class NotionToMarkdown {
|
|
|
222
225
|
* @returns {string} corresponding markdown string of the passed block
|
|
223
226
|
*/
|
|
224
227
|
async blockToMarkdown(block) {
|
|
228
|
+
var _a;
|
|
225
229
|
if (typeof block !== "object" || !("type" in block))
|
|
226
230
|
return "";
|
|
227
231
|
let parsedData = "";
|
|
@@ -354,7 +358,7 @@ class NotionToMarkdown {
|
|
|
354
358
|
type: "paragraph",
|
|
355
359
|
paragraph: { rich_text: cell },
|
|
356
360
|
}));
|
|
357
|
-
const cellStringArr = await Promise.all(cellStringPromise);
|
|
361
|
+
const cellStringArr = (await Promise.all(cellStringPromise)).map((s) => s.replace(/\n/g, '<br>'));
|
|
358
362
|
tableArr.push(cellStringArr);
|
|
359
363
|
});
|
|
360
364
|
await Promise.all(rowsPromise || []);
|
|
@@ -392,7 +396,16 @@ class NotionToMarkdown {
|
|
|
392
396
|
}
|
|
393
397
|
const annotations = content.annotations;
|
|
394
398
|
let plain_text = content.plain_text;
|
|
395
|
-
|
|
399
|
+
const escape = this.config.escapeMarkdown
|
|
400
|
+
? type === "toggle"
|
|
401
|
+
? md.escapeHtml
|
|
402
|
+
: md.escapeMarkdown
|
|
403
|
+
: undefined;
|
|
404
|
+
plain_text = this.annotatePlainText(plain_text, annotations, escape);
|
|
405
|
+
if (escape === md.escapeMarkdown &&
|
|
406
|
+
/^[.)]/.test(plain_text) &&
|
|
407
|
+
/(^|\n)[ \t]*\d+$/.test(parsedData))
|
|
408
|
+
plain_text = "\\" + plain_text;
|
|
396
409
|
if (content["href"])
|
|
397
410
|
plain_text = md.link(plain_text, content["href"]);
|
|
398
411
|
parsedData += plain_text;
|
|
@@ -402,7 +415,7 @@ class NotionToMarkdown {
|
|
|
402
415
|
switch (type) {
|
|
403
416
|
case "code":
|
|
404
417
|
{
|
|
405
|
-
const codeContent = block.code.rich_text.map((t) => t.plain_text).join("
|
|
418
|
+
const codeContent = block.code.rich_text.map((t) => t.plain_text).join("");
|
|
406
419
|
const language = block.code.language || "plaintext";
|
|
407
420
|
parsedData = md.codeBlock(codeContent, language);
|
|
408
421
|
}
|
|
@@ -451,7 +464,7 @@ class NotionToMarkdown {
|
|
|
451
464
|
break;
|
|
452
465
|
case "numbered_list_item":
|
|
453
466
|
{
|
|
454
|
-
parsedData = md.bullet(parsedData, block.numbered_list_item.number);
|
|
467
|
+
parsedData = md.bullet(parsedData, (_a = block.numbered_list_item.number) !== null && _a !== void 0 ? _a : 1);
|
|
455
468
|
}
|
|
456
469
|
break;
|
|
457
470
|
case "to_do":
|
|
@@ -468,7 +481,10 @@ class NotionToMarkdown {
|
|
|
468
481
|
* @param {Annotations} annotations - Annotation object of a notion block
|
|
469
482
|
* @returns {string} - Annotated text
|
|
470
483
|
*/
|
|
471
|
-
annotatePlainText(text, annotations
|
|
484
|
+
annotatePlainText(text, annotations, escape = this.config
|
|
485
|
+
.escapeMarkdown
|
|
486
|
+
? md.escapeMarkdown
|
|
487
|
+
: undefined) {
|
|
472
488
|
// if text is all spaces, don't annotate
|
|
473
489
|
if (text.match(/^\s*$/))
|
|
474
490
|
return text;
|
|
@@ -480,6 +496,8 @@ class NotionToMarkdown {
|
|
|
480
496
|
if (text !== "") {
|
|
481
497
|
if (annotations.code)
|
|
482
498
|
text = md.inlineCode(text);
|
|
499
|
+
else if (escape)
|
|
500
|
+
text = escape(text);
|
|
483
501
|
if (annotations.bold)
|
|
484
502
|
text = md.bold(text);
|
|
485
503
|
if (annotations.italic)
|
|
@@ -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 ConfigurationOptions,\n MdStringObject,\n BlockType,\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 config: ConfigurationOptions;\n private customTransformers: Record<string, CustomTransformer>;\n\n constructor(options: NotionToMarkdownOptions) {\n this.notionClient = options.notionClient;\n const defaultConfig: ConfigurationOptions = {\n separateChildPage: false,\n convertImagesToBase64: false,\n parseChildPages: true,\n };\n this.config = { ...defaultConfig, ...options.config };\n this.customTransformers = {};\n }\n\n setCustomTransformer(\n type: BlockType,\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 {MdStringObject} - Returns markdown string with child pages separated\n */\n toMarkdownString(\n mdBlocks: MdBlock[] = [],\n pageIdentifier: string = \"parent\",\n nestingLevel: number = 0,\n ): MdStringObject {\n let mdOutput: MdStringObject = {};\n\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 (\n mdBlocks.parent &&\n mdBlocks.type !== \"toggle\" &&\n mdBlocks.type !== \"child_page\"\n ) {\n if (\n mdBlocks.type !== \"to_do\" &&\n mdBlocks.type !== \"bulleted_list_item\" &&\n mdBlocks.type !== \"numbered_list_item\" &&\n mdBlocks.type !== \"quote\"\n ) {\n // initialize if key doesn't exist\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n\n // add extra line breaks non list blocks\n mdOutput[pageIdentifier] += `\\n${md.addTabSpace(\n mdBlocks.parent,\n nestingLevel,\n )}\\n\\n`;\n } else {\n // initialize if key doesn't exist\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n\n mdOutput[pageIdentifier] += `${md.addTabSpace(\n mdBlocks.parent,\n nestingLevel,\n )}\\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, pageIdentifier);\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n\n Object.keys(mdstr).forEach((key) => {\n if (mdOutput[key]) {\n mdOutput[key] += mdstr[key];\n } else {\n mdOutput[key] = mdstr[key];\n }\n });\n } else if (mdBlocks.type === \"child_page\") {\n const childPageTitle = mdBlocks.parent;\n let mdstr = this.toMarkdownString(mdBlocks.children, childPageTitle);\n\n if (this.config.separateChildPage) {\n mdOutput = { ...mdOutput, ...mdstr };\n } else {\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n if (mdstr[childPageTitle]) {\n // child page heading followed by child page content\n mdOutput[pageIdentifier] +=\n `\\n${childPageTitle}\\n${mdstr[childPageTitle]}`;\n }\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 mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n mdOutput[pageIdentifier] += md.toggle(\n mdBlocks.parent,\n toggle_children_md_string[\"parent\"],\n );\n } else if (mdBlocks.type === \"quote\") {\n let mdstr = this.toMarkdownString(\n mdBlocks.children,\n pageIdentifier,\n nestingLevel,\n );\n\n const formattedContent = mdstr.parent\n .split(\"\\n\")\n .map((line) => (line.trim() ? `> ${line}` : \">\"))\n .join(\"\\n\")\n .trim();\n\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n\n if (pageIdentifier !== \"parent\" && mdstr[\"parent\"]) {\n mdOutput[pageIdentifier] += formattedContent;\n } else if (mdstr[pageIdentifier]) {\n mdOutput[pageIdentifier] += formattedContent;\n }\n\n mdOutput[pageIdentifier] += \"\\n\";\n } else if (mdBlocks.type === \"callout\") {\n // do nothing the callout block is already processed\n }\n else {\n let mdstr = this.toMarkdownString(\n mdBlocks.children,\n pageIdentifier,\n nestingLevel + 1,\n );\n\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n if (pageIdentifier !== \"parent\" && mdstr[\"parent\"]) {\n mdOutput[pageIdentifier] += mdstr[\"parent\"];\n } else if (mdstr[pageIdentifier]) {\n mdOutput[pageIdentifier] += mdstr[pageIdentifier];\n }\n }\n }\n });\n\n return mdOutput;\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 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 - Array of markdown blocks\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: ListBlockChildrenResponseResult = blocks[i];\n\n if (\n // @ts-ignore\n block.type === \"unsupported\" ||\n // @ts-ignore\n (block.type === \"child_page\" && !this.config.parseChildPages)\n ) {\n continue;\n }\n\n if (\"has_children\" in block && block.has_children) {\n const block_id =\n block.type == \"synced_block\" &&\n block.synced_block?.synced_from?.block_id\n ? block.synced_block.synced_from.block_id\n : block.id;\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 // check for custom transformer before parsing child\n if (\n !(block.type in this.customTransformers) &&\n !this.customTransformers[block.type]\n ) {\n let l = mdBlocks.length;\n await this.blocksToMarkdown(\n child_blocks,\n totalPage,\n mdBlocks[l - 1].children,\n );\n }\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 (typeof customTransformerValue === \"string\")\n return customTransformerValue;\n }\n\n switch (type) {\n case \"image\":\n {\n let blockContent = block.image;\n let image_title = \"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 let link = \"\";\n\n if (image_type === \"external\") {\n link = blockContent.external.url;\n }\n\n if (image_type === \"file\") {\n link = blockContent.file.url;\n }\n\n // image caption with high priority\n if (image_caption_plain.trim().length > 0) {\n image_title = image_caption_plain;\n } else if (image_type === \"file\" || image_type === \"external\") {\n const matches = link.match(/[^\\/\\\\&\\?]+\\.\\w{3,4}(?=([\\?&].*$|$))/);\n image_title = matches ? matches[0] : image_title;\n }\n\n return await md.image(\n image_title,\n link,\n this.config.convertImagesToBase64,\n );\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 let title: string = type;\n\n if (type === \"video\") blockContent = block.video;\n if (type === \"file\") blockContent = block.file;\n if (type === \"pdf\") blockContent = block.pdf;\n\n const caption = blockContent?.caption\n .map((item: any) => item.plain_text)\n .join(\"\");\n\n if (blockContent) {\n const file_type = blockContent.type;\n let link = \"\";\n if (file_type === \"external\") link = blockContent.external.url;\n if (file_type === \"file\") link = blockContent.file.url;\n\n if (caption && caption.trim().length > 0) {\n title = caption;\n } else if (link) {\n const matches = link.match(\n /[^\\/\\\\&\\?]+\\.\\w{3,4}(?=([\\?&].*$|$))/,\n );\n title = matches ? matches[0] : type;\n }\n\n return md.link(title, link);\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 = {\n url: `https://www.notion.so/${block.link_to_page.page_id}`,\n };\n }\n\n if (blockContent) return md.link(title, blockContent.url);\n }\n break;\n\n case \"child_page\":\n {\n if (!this.config.parseChildPages) return \"\";\n\n let pageTitle: string = block.child_page.title;\n\n if (this.config.separateChildPage) {\n return pageTitle;\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 if (type !== 'table_row') return\n const cells = (row as any).table_row[\"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 const codeContent = block.code.rich_text.map((t: any) => t.plain_text).join(\"\\n\");\n const language = block.code.language || \"plaintext\";\n parsedData = md.codeBlock(codeContent, 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\";\n\nimport {\n Annotations,\n CustomTransformer,\n ListBlockChildrenResponseResult,\n ListBlockChildrenResponseResults,\n MdBlock,\n NotionToMarkdownOptions,\n Equation,\n Text,\n ConfigurationOptions,\n MdStringObject,\n BlockType,\n} from \"./types\";\nimport * as md from \"./utils/md\";\nimport { getBlockChildren, modifyNumberedListObject } from \"./utils/notion\";\n\n/**\n * Converts a Notion page to Markdown.\n */\nexport class NotionToMarkdown {\n private notionClient: Client;\n private config: ConfigurationOptions;\n private customTransformers: Record<string, CustomTransformer>;\n\n constructor(options: NotionToMarkdownOptions) {\n this.notionClient = options.notionClient;\n const defaultConfig: ConfigurationOptions = {\n separateChildPage: false,\n convertImagesToBase64: false,\n parseChildPages: true,\n escapeMarkdown: false,\n };\n this.config = { ...defaultConfig, ...options.config };\n this.customTransformers = {};\n }\n\n setCustomTransformer(\n type: BlockType,\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 {MdStringObject} - Returns markdown string with child pages separated\n */\n toMarkdownString(\n mdBlocks: MdBlock[] = [],\n pageIdentifier: string = \"parent\",\n nestingLevel: number = 0,\n ): MdStringObject {\n let mdOutput: MdStringObject = {};\n\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 (\n mdBlocks.parent &&\n mdBlocks.type !== \"toggle\" &&\n mdBlocks.type !== \"child_page\"\n ) {\n if (\n mdBlocks.type !== \"to_do\" &&\n mdBlocks.type !== \"bulleted_list_item\" &&\n mdBlocks.type !== \"numbered_list_item\" &&\n mdBlocks.type !== \"quote\"\n ) {\n // initialize if key doesn't exist\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n\n // add extra line breaks non list blocks\n mdOutput[pageIdentifier] += `\\n${md.addTabSpace(\n mdBlocks.parent,\n nestingLevel,\n )}\\n\\n`;\n } else {\n // initialize if key doesn't exist\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n\n mdOutput[pageIdentifier] += `${md.addTabSpace(\n mdBlocks.parent,\n nestingLevel,\n )}\\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, pageIdentifier);\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n\n Object.keys(mdstr).forEach((key) => {\n if (mdOutput[key]) {\n mdOutput[key] += mdstr[key];\n } else {\n mdOutput[key] = mdstr[key];\n }\n });\n } else if (mdBlocks.type === \"child_page\") {\n const childPageTitle = mdBlocks.parent;\n let mdstr = this.toMarkdownString(mdBlocks.children, childPageTitle);\n\n if (this.config.separateChildPage) {\n mdOutput = { ...mdOutput, ...mdstr };\n } else {\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n if (mdstr[childPageTitle]) {\n // child page heading followed by child page content\n mdOutput[pageIdentifier] +=\n `\\n${childPageTitle}\\n${mdstr[childPageTitle]}`;\n }\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 mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n mdOutput[pageIdentifier] += md.toggle(\n mdBlocks.parent,\n toggle_children_md_string[\"parent\"],\n );\n } else if (mdBlocks.type === \"quote\") {\n let mdstr = this.toMarkdownString(\n mdBlocks.children,\n pageIdentifier,\n nestingLevel,\n );\n\n const formattedContent = (mdstr.parent ?? mdstr[pageIdentifier] ?? '')\n .split(\"\\n\")\n .map((line) => (line.trim() ? `> ${line}` : \">\"))\n .join(\"\\n\")\n .trim();\n\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n\n if (pageIdentifier !== \"parent\" && mdstr[\"parent\"]) {\n mdOutput[pageIdentifier] += formattedContent;\n } else if (mdstr[pageIdentifier]) {\n mdOutput[pageIdentifier] += formattedContent;\n }\n\n mdOutput[pageIdentifier] += \"\\n\";\n } else if (mdBlocks.type === \"callout\") {\n // do nothing the callout block is already processed\n }\n else {\n let mdstr = this.toMarkdownString(\n mdBlocks.children,\n pageIdentifier,\n nestingLevel + 1,\n );\n\n mdOutput[pageIdentifier] = mdOutput[pageIdentifier] || \"\";\n if (pageIdentifier !== \"parent\" && mdstr[\"parent\"]) {\n mdOutput[pageIdentifier] += mdstr[\"parent\"];\n } else if (mdstr[pageIdentifier]) {\n mdOutput[pageIdentifier] += mdstr[pageIdentifier];\n }\n }\n }\n });\n\n return mdOutput;\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 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 - Array of markdown blocks\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 modifyNumberedListObject(blocks);\n\n for (let i = 0; i < blocks.length; i++) {\n let block: ListBlockChildrenResponseResult = blocks[i];\n\n if (\n // @ts-ignore\n block.type === \"unsupported\" ||\n // @ts-ignore\n (block.type === \"child_page\" && !this.config.parseChildPages)\n ) {\n continue;\n }\n\n if (\"has_children\" in block && block.has_children) {\n const block_id =\n block.type == \"synced_block\" &&\n block.synced_block?.synced_from?.block_id\n ? block.synced_block.synced_from.block_id\n : block.id;\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 // check for custom transformer before parsing child\n if (\n !(block.type in this.customTransformers) &&\n !this.customTransformers[block.type]\n ) {\n let l = mdBlocks.length;\n await this.blocksToMarkdown(\n child_blocks,\n totalPage,\n mdBlocks[l - 1].children,\n );\n }\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 (typeof customTransformerValue === \"string\")\n return customTransformerValue;\n }\n\n switch (type) {\n case \"image\":\n {\n let blockContent = block.image;\n let image_title = \"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 let link = \"\";\n\n if (image_type === \"external\") {\n link = blockContent.external.url;\n }\n\n if (image_type === \"file\") {\n link = blockContent.file.url;\n }\n\n // image caption with high priority\n if (image_caption_plain.trim().length > 0) {\n image_title = image_caption_plain;\n } else if (image_type === \"file\" || image_type === \"external\") {\n const matches = link.match(/[^\\/\\\\&\\?]+\\.\\w{3,4}(?=([\\?&].*$|$))/);\n image_title = matches ? matches[0] : image_title;\n }\n\n return await md.image(\n image_title,\n link,\n this.config.convertImagesToBase64,\n );\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 let title: string = type;\n\n if (type === \"video\") blockContent = block.video;\n if (type === \"file\") blockContent = block.file;\n if (type === \"pdf\") blockContent = block.pdf;\n\n const caption = blockContent?.caption\n .map((item: any) => item.plain_text)\n .join(\"\");\n\n if (blockContent) {\n const file_type = blockContent.type;\n let link = \"\";\n if (file_type === \"external\") link = blockContent.external.url;\n if (file_type === \"file\") link = blockContent.file.url;\n\n if (caption && caption.trim().length > 0) {\n title = caption;\n } else if (link) {\n const matches = link.match(\n /[^\\/\\\\&\\?]+\\.\\w{3,4}(?=([\\?&].*$|$))/,\n );\n title = matches ? matches[0] : type;\n }\n\n return md.link(title, link);\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 = {\n url: `https://www.notion.so/${block.link_to_page.page_id}`,\n };\n }\n\n if (blockContent) return md.link(title, blockContent.url);\n }\n break;\n\n case \"child_page\":\n {\n if (!this.config.parseChildPages) return \"\";\n\n let pageTitle: string = block.child_page.title;\n\n if (this.config.separateChildPage) {\n return pageTitle;\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 if (type !== 'table_row') return\n const cells = (row as any).table_row[\"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)).map((s) => s.replace(/\\n/g, '<br>'));\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 const escape = this.config.escapeMarkdown\n ? type === \"toggle\"\n ? md.escapeHtml\n : md.escapeMarkdown\n : undefined;\n\n plain_text = this.annotatePlainText(plain_text, annotations, escape);\n\n if (\n escape === md.escapeMarkdown &&\n /^[.)]/.test(plain_text) &&\n /(^|\\n)[ \\t]*\\d+$/.test(parsedData)\n )\n plain_text = \"\\\\\" + plain_text;\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 const codeContent = block.code.rich_text.map((t: any) => t.plain_text).join(\"\");\n const language = block.code.language || \"plaintext\";\n parsedData = md.codeBlock(codeContent, 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(\n parsedData,\n block.numbered_list_item.number ?? 1,\n );\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(\n text: string,\n annotations: Annotations,\n escape: ((text: string) => string) | undefined = this.config\n .escapeMarkdown\n ? md.escapeMarkdown\n : undefined,\n ): 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 else if (escape) text = escape(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"]}
|
|
@@ -63,4 +63,178 @@ describe("setCustomTransformer", () => {
|
|
|
63
63
|
expect(md).toBe("---");
|
|
64
64
|
});
|
|
65
65
|
});
|
|
66
|
+
describe("Markdown escaping in blockToMarkdown (issue #176)", () => {
|
|
67
|
+
const rt = (content, ann = {}) => ({
|
|
68
|
+
type: "text",
|
|
69
|
+
text: { content, link: null },
|
|
70
|
+
plain_text: content,
|
|
71
|
+
href: null,
|
|
72
|
+
annotations: {
|
|
73
|
+
bold: false,
|
|
74
|
+
italic: false,
|
|
75
|
+
strikethrough: false,
|
|
76
|
+
underline: false,
|
|
77
|
+
code: false,
|
|
78
|
+
color: "default",
|
|
79
|
+
...ann,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
const para = (...r) => ({
|
|
83
|
+
object: "block",
|
|
84
|
+
id: "1",
|
|
85
|
+
type: "paragraph",
|
|
86
|
+
has_children: false,
|
|
87
|
+
paragraph: { rich_text: r, color: "default" },
|
|
88
|
+
});
|
|
89
|
+
const code = (s, language) => ({
|
|
90
|
+
object: "block",
|
|
91
|
+
id: "2",
|
|
92
|
+
type: "code",
|
|
93
|
+
has_children: false,
|
|
94
|
+
code: { rich_text: [rt(s)], language, caption: [] },
|
|
95
|
+
});
|
|
96
|
+
const plain = new notion_to_md_1.NotionToMarkdown({ notionClient: {} });
|
|
97
|
+
const escaping = new notion_to_md_1.NotionToMarkdown({
|
|
98
|
+
notionClient: {},
|
|
99
|
+
config: { escapeMarkdown: true },
|
|
100
|
+
});
|
|
101
|
+
test("plain text is unchanged by default", async () => {
|
|
102
|
+
expect(await plain.blockToMarkdown(para(rt("2*3*4 = 24")))).toBe("2*3*4 = 24");
|
|
103
|
+
});
|
|
104
|
+
test("plain text is escaped when escapeMarkdown is enabled", async () => {
|
|
105
|
+
expect(await escaping.blockToMarkdown(para(rt("2*3*4 = 24")))).toBe("2\\*3\\*4 = 24");
|
|
106
|
+
expect(await escaping.blockToMarkdown(para(rt("# not a heading")))).toBe("\\# not a heading");
|
|
107
|
+
expect(await escaping.blockToMarkdown(para(rt("1. not a list")))).toBe("1\\. not a list");
|
|
108
|
+
});
|
|
109
|
+
test("annotations still apply on top of escaped text", async () => {
|
|
110
|
+
expect(await escaping.blockToMarkdown(para(rt("a*b", { bold: true })))).toBe("**a\\*b**");
|
|
111
|
+
});
|
|
112
|
+
test("inline code is never escaped and survives backticks", async () => {
|
|
113
|
+
expect(await escaping.blockToMarkdown(para(rt("a`b", { code: true })))).toBe("``a`b``");
|
|
114
|
+
});
|
|
115
|
+
test("code blocks with fences and indentation", async () => {
|
|
116
|
+
expect(await plain.blockToMarkdown(code("```\ninner\n```", "markdown"))).toBe("````markdown\n```\ninner\n```\n````");
|
|
117
|
+
expect(await plain.blockToMarkdown(code(" indented()\nnext()", "python"))).toBe("```python\n indented()\nnext()\n```");
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("escapeMarkdown with toggles", () => {
|
|
121
|
+
const rt = (content, ann = {}) => ({
|
|
122
|
+
type: "text",
|
|
123
|
+
text: { content, link: null },
|
|
124
|
+
plain_text: content,
|
|
125
|
+
href: null,
|
|
126
|
+
annotations: {
|
|
127
|
+
bold: false, italic: false, strikethrough: false,
|
|
128
|
+
underline: false, code: false, color: "default",
|
|
129
|
+
...ann,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
const summaryOf = async (...pieces) => {
|
|
133
|
+
const child = {
|
|
134
|
+
object: "block", id: "c", type: "paragraph", has_children: false,
|
|
135
|
+
paragraph: { rich_text: [rt("child")], color: "default" },
|
|
136
|
+
};
|
|
137
|
+
const toggle = {
|
|
138
|
+
object: "block", id: "t", type: "toggle", has_children: true,
|
|
139
|
+
toggle: { rich_text: pieces, color: "default" },
|
|
140
|
+
};
|
|
141
|
+
const client = {
|
|
142
|
+
blocks: {
|
|
143
|
+
children: {
|
|
144
|
+
list: async ({ block_id }) => ({
|
|
145
|
+
results: block_id === "t" ? [child] : [],
|
|
146
|
+
has_more: false,
|
|
147
|
+
next_cursor: null,
|
|
148
|
+
}),
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
const n2m = new notion_to_md_1.NotionToMarkdown({
|
|
153
|
+
notionClient: client,
|
|
154
|
+
config: { escapeMarkdown: true },
|
|
155
|
+
});
|
|
156
|
+
const out = n2m.toMarkdownString(await n2m.blocksToMarkdown([toggle])).parent;
|
|
157
|
+
return out.match(/<summary>([\s\S]*?)<\/summary>/)[1];
|
|
158
|
+
};
|
|
159
|
+
test("toggle summary is HTML-safe instead of backslash-escaped", async () => {
|
|
160
|
+
expect(await summaryOf(rt("2*3 <b>"))).toBe("2*3 <b>");
|
|
161
|
+
});
|
|
162
|
+
test("underlined toggle summary keeps its <u> tags", async () => {
|
|
163
|
+
expect(await summaryOf(rt("Title", { underline: true }))).toBe("<u>Title</u>");
|
|
164
|
+
});
|
|
165
|
+
test("code toggle summary keeps its backslashes", async () => {
|
|
166
|
+
expect(await summaryOf(rt("a\\*b", { code: true }))).toBe("`a\\*b`");
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe("escapeMarkdown across rich text pieces", () => {
|
|
170
|
+
test("ordered list marker split across pieces is escaped", async () => {
|
|
171
|
+
const rt = (content) => ({
|
|
172
|
+
type: "text",
|
|
173
|
+
text: { content, link: null },
|
|
174
|
+
plain_text: content,
|
|
175
|
+
href: null,
|
|
176
|
+
annotations: {
|
|
177
|
+
bold: false, italic: false, strikethrough: false,
|
|
178
|
+
underline: false, code: false, color: "default",
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
const n2m = new notion_to_md_1.NotionToMarkdown({
|
|
182
|
+
notionClient: {},
|
|
183
|
+
config: { escapeMarkdown: true },
|
|
184
|
+
});
|
|
185
|
+
const para = {
|
|
186
|
+
object: "block", id: "p", type: "paragraph", has_children: false,
|
|
187
|
+
paragraph: { rich_text: [rt("1"), rt(". not a list")], color: "default" },
|
|
188
|
+
};
|
|
189
|
+
expect(await n2m.blockToMarkdown(para)).toBe("1\\. not a list");
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
describe("code block regressions from PR #125", () => {
|
|
193
|
+
const piece = (content) => ({
|
|
194
|
+
type: "text",
|
|
195
|
+
text: { content, link: null },
|
|
196
|
+
plain_text: content,
|
|
197
|
+
href: null,
|
|
198
|
+
annotations: {
|
|
199
|
+
bold: false, italic: false, strikethrough: false,
|
|
200
|
+
underline: false, code: false, color: "default",
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
const code = (pieces, language) => ({
|
|
204
|
+
object: "block", id: "x", type: "code", has_children: false,
|
|
205
|
+
code: { rich_text: pieces.map(piece), language, caption: [] },
|
|
206
|
+
});
|
|
207
|
+
const n2m = new notion_to_md_1.NotionToMarkdown({ notionClient: {} });
|
|
208
|
+
test("rich text pieces are joined without adding newlines", async () => {
|
|
209
|
+
expect(await n2m.blockToMarkdown(code(["const x = ", "42", ";"], "javascript"))).toBe("```javascript\nconst x = 42;\n```");
|
|
210
|
+
});
|
|
211
|
+
test('"plain text" language maps to "text" (#47)', async () => {
|
|
212
|
+
expect(await n2m.blockToMarkdown(code(["hello"], "plain text"))).toBe("```text\nhello\n```");
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
describe("numbered lists from caller-fetched blocks (#166)", () => {
|
|
216
|
+
const item = (id, content) => ({
|
|
217
|
+
object: "block", id, type: "numbered_list_item", has_children: false,
|
|
218
|
+
numbered_list_item: {
|
|
219
|
+
rich_text: [{
|
|
220
|
+
type: "text", text: { content, link: null }, plain_text: content,
|
|
221
|
+
href: null,
|
|
222
|
+
annotations: {
|
|
223
|
+
bold: false, italic: false, strikethrough: false,
|
|
224
|
+
underline: false, code: false, color: "default",
|
|
225
|
+
},
|
|
226
|
+
}],
|
|
227
|
+
color: "default",
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
const n2m = new notion_to_md_1.NotionToMarkdown({ notionClient: {} });
|
|
231
|
+
test("blocksToMarkdown numbers items that have no number yet", async () => {
|
|
232
|
+
const out = n2m.toMarkdownString(await n2m.blocksToMarkdown([item("a", "Buy milk"), item("b", "Call mom")])).parent;
|
|
233
|
+
expect(out).toContain("1. Buy milk");
|
|
234
|
+
expect(out).toContain("2. Call mom");
|
|
235
|
+
});
|
|
236
|
+
test("a single block without a number falls back to 1.", async () => {
|
|
237
|
+
expect(await n2m.blockToMarkdown(item("c", "Solo"))).toBe("1. Solo");
|
|
238
|
+
});
|
|
239
|
+
});
|
|
66
240
|
//# sourceMappingURL=notion-to-md.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notion-to-md.spec.js","sourceRoot":"","sources":["../src/notion-to-md.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { NotionToMarkdown } from \"./notion-to-md\";\n\ndescribe(\"setCustomTransformer\", () => {\n test(\"blockToMarkdown sends parsing block to customTransformer\", () => {\n const customTransformerMock = jest.fn();\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n n2m.setCustomTransformer(\"test\", customTransformerMock);\n n2m.blockToMarkdown({\n id: \"test\",\n name: \"test\",\n type: \"test\",\n test: { foo: \"bar\" },\n } as any);\n expect(customTransformerMock).toHaveBeenCalledWith(\n expect.objectContaining({\n type: \"test\",\n test: { foo: \"bar\" },\n })\n );\n });\n test(\"supports only one customTransformer per type \", () => {\n const customTransformerMock1 = jest.fn();\n const customTransformerMock2 = jest.fn();\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n n2m.setCustomTransformer(\"test\", customTransformerMock1);\n n2m.setCustomTransformer(\"test\", customTransformerMock2);\n n2m.blockToMarkdown({\n id: \"test\",\n name: \"test\",\n type: \"test\",\n test: { foo: \"bar\" },\n } as any);\n expect(customTransformerMock1).not.toHaveBeenCalled();\n expect(customTransformerMock2).toHaveBeenCalled();\n });\n\n test(\"customTransformer implementation works\", async () => {\n const customTransformerMock = jest.fn();\n customTransformerMock.mockImplementation(async () => {\n return \"hello\";\n });\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n n2m.setCustomTransformer(\"divider\", customTransformerMock);\n const md = await n2m.blockToMarkdown({\n id: \"test\",\n type: \"divider\",\n divider: {},\n object: \"block\",\n });\n expect(md).toBe(\"hello\");\n });\n\n test(\"customTransformer default implementation works\", async () => {\n const customTransformerMock = jest.fn();\n customTransformerMock.mockImplementation(async () => {\n return false;\n });\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n n2m.setCustomTransformer(\"divider\", customTransformerMock);\n const md = await n2m.blockToMarkdown({\n id: \"test\",\n type: \"divider\",\n divider: {},\n object: \"block\",\n });\n expect(md).toBe(\"---\");\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"notion-to-md.spec.js","sourceRoot":"","sources":["../src/notion-to-md.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { NotionToMarkdown } from \"./notion-to-md\";\n\ndescribe(\"setCustomTransformer\", () => {\n test(\"blockToMarkdown sends parsing block to customTransformer\", () => {\n const customTransformerMock = jest.fn();\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n n2m.setCustomTransformer(\"test\", customTransformerMock);\n n2m.blockToMarkdown({\n id: \"test\",\n name: \"test\",\n type: \"test\",\n test: { foo: \"bar\" },\n } as any);\n expect(customTransformerMock).toHaveBeenCalledWith(\n expect.objectContaining({\n type: \"test\",\n test: { foo: \"bar\" },\n })\n );\n });\n test(\"supports only one customTransformer per type \", () => {\n const customTransformerMock1 = jest.fn();\n const customTransformerMock2 = jest.fn();\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n n2m.setCustomTransformer(\"test\", customTransformerMock1);\n n2m.setCustomTransformer(\"test\", customTransformerMock2);\n n2m.blockToMarkdown({\n id: \"test\",\n name: \"test\",\n type: \"test\",\n test: { foo: \"bar\" },\n } as any);\n expect(customTransformerMock1).not.toHaveBeenCalled();\n expect(customTransformerMock2).toHaveBeenCalled();\n });\n\n test(\"customTransformer implementation works\", async () => {\n const customTransformerMock = jest.fn();\n customTransformerMock.mockImplementation(async () => {\n return \"hello\";\n });\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n n2m.setCustomTransformer(\"divider\", customTransformerMock);\n const md = await n2m.blockToMarkdown({\n id: \"test\",\n type: \"divider\",\n divider: {},\n object: \"block\",\n });\n expect(md).toBe(\"hello\");\n });\n\n test(\"customTransformer default implementation works\", async () => {\n const customTransformerMock = jest.fn();\n customTransformerMock.mockImplementation(async () => {\n return false;\n });\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n n2m.setCustomTransformer(\"divider\", customTransformerMock);\n const md = await n2m.blockToMarkdown({\n id: \"test\",\n type: \"divider\",\n divider: {},\n object: \"block\",\n });\n expect(md).toBe(\"---\");\n });\n});\n\ndescribe(\"Markdown escaping in blockToMarkdown (issue #176)\", () => {\n const rt = (content: string, ann: Record<string, any> = {}) => ({\n type: \"text\",\n text: { content, link: null },\n plain_text: content,\n href: null,\n annotations: {\n bold: false,\n italic: false,\n strikethrough: false,\n underline: false,\n code: false,\n color: \"default\",\n ...ann,\n },\n });\n const para = (...r: any[]) =>\n ({\n object: \"block\",\n id: \"1\",\n type: \"paragraph\",\n has_children: false,\n paragraph: { rich_text: r, color: \"default\" },\n } as any);\n const code = (s: string, language: string) =>\n ({\n object: \"block\",\n id: \"2\",\n type: \"code\",\n has_children: false,\n code: { rich_text: [rt(s)], language, caption: [] },\n } as any);\n\n const plain = new NotionToMarkdown({ notionClient: {} as any });\n const escaping = new NotionToMarkdown({\n notionClient: {} as any,\n config: { escapeMarkdown: true },\n });\n\n test(\"plain text is unchanged by default\", async () => {\n expect(await plain.blockToMarkdown(para(rt(\"2*3*4 = 24\")))).toBe(\n \"2*3*4 = 24\"\n );\n });\n test(\"plain text is escaped when escapeMarkdown is enabled\", async () => {\n expect(await escaping.blockToMarkdown(para(rt(\"2*3*4 = 24\")))).toBe(\n \"2\\\\*3\\\\*4 = 24\"\n );\n expect(await escaping.blockToMarkdown(para(rt(\"# not a heading\")))).toBe(\n \"\\\\# not a heading\"\n );\n expect(await escaping.blockToMarkdown(para(rt(\"1. not a list\")))).toBe(\n \"1\\\\. not a list\"\n );\n });\n test(\"annotations still apply on top of escaped text\", async () => {\n expect(\n await escaping.blockToMarkdown(para(rt(\"a*b\", { bold: true })))\n ).toBe(\"**a\\\\*b**\");\n });\n test(\"inline code is never escaped and survives backticks\", async () => {\n expect(\n await escaping.blockToMarkdown(para(rt(\"a`b\", { code: true })))\n ).toBe(\"``a`b``\");\n });\n test(\"code blocks with fences and indentation\", async () => {\n expect(\n await plain.blockToMarkdown(code(\"```\\ninner\\n```\", \"markdown\"))\n ).toBe(\"````markdown\\n```\\ninner\\n```\\n````\");\n expect(\n await plain.blockToMarkdown(code(\" indented()\\nnext()\", \"python\"))\n ).toBe(\"```python\\n indented()\\nnext()\\n```\");\n });\n});\n\ndescribe(\"escapeMarkdown with toggles\", () => {\n const rt = (content: string, ann: Record<string, any> = {}) => ({\n type: \"text\",\n text: { content, link: null },\n plain_text: content,\n href: null,\n annotations: {\n bold: false, italic: false, strikethrough: false,\n underline: false, code: false, color: \"default\",\n ...ann,\n },\n });\n const summaryOf = async (...pieces: any[]) => {\n const child = {\n object: \"block\", id: \"c\", type: \"paragraph\", has_children: false,\n paragraph: { rich_text: [rt(\"child\")], color: \"default\" },\n };\n const toggle = {\n object: \"block\", id: \"t\", type: \"toggle\", has_children: true,\n toggle: { rich_text: pieces, color: \"default\" },\n };\n const client = {\n blocks: {\n children: {\n list: async ({ block_id }: any) => ({\n results: block_id === \"t\" ? [child] : [],\n has_more: false,\n next_cursor: null,\n }),\n },\n },\n };\n const n2m = new NotionToMarkdown({\n notionClient: client as any,\n config: { escapeMarkdown: true },\n });\n const out = n2m.toMarkdownString(\n await n2m.blocksToMarkdown([toggle as any])\n ).parent;\n return out.match(/<summary>([\\s\\S]*?)<\\/summary>/)![1];\n };\n\n test(\"toggle summary is HTML-safe instead of backslash-escaped\", async () => {\n expect(await summaryOf(rt(\"2*3 <b>\"))).toBe(\"2*3 <b>\");\n });\n test(\"underlined toggle summary keeps its <u> tags\", async () => {\n expect(await summaryOf(rt(\"Title\", { underline: true }))).toBe(\n \"<u>Title</u>\"\n );\n });\n test(\"code toggle summary keeps its backslashes\", async () => {\n expect(await summaryOf(rt(\"a\\\\*b\", { code: true }))).toBe(\"`a\\\\*b`\");\n });\n});\n\ndescribe(\"escapeMarkdown across rich text pieces\", () => {\n test(\"ordered list marker split across pieces is escaped\", async () => {\n const rt = (content: string) => ({\n type: \"text\",\n text: { content, link: null },\n plain_text: content,\n href: null,\n annotations: {\n bold: false, italic: false, strikethrough: false,\n underline: false, code: false, color: \"default\",\n },\n });\n const n2m = new NotionToMarkdown({\n notionClient: {} as any,\n config: { escapeMarkdown: true },\n });\n const para = {\n object: \"block\", id: \"p\", type: \"paragraph\", has_children: false,\n paragraph: { rich_text: [rt(\"1\"), rt(\". not a list\")], color: \"default\" },\n };\n expect(await n2m.blockToMarkdown(para as any)).toBe(\"1\\\\. not a list\");\n });\n});\n\ndescribe(\"code block regressions from PR #125\", () => {\n const piece = (content: string) => ({\n type: \"text\",\n text: { content, link: null },\n plain_text: content,\n href: null,\n annotations: {\n bold: false, italic: false, strikethrough: false,\n underline: false, code: false, color: \"default\",\n },\n });\n const code = (pieces: string[], language: string) =>\n ({\n object: \"block\", id: \"x\", type: \"code\", has_children: false,\n code: { rich_text: pieces.map(piece), language, caption: [] },\n } as any);\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n\n test(\"rich text pieces are joined without adding newlines\", async () => {\n expect(\n await n2m.blockToMarkdown(code([\"const x = \", \"42\", \";\"], \"javascript\"))\n ).toBe(\"```javascript\\nconst x = 42;\\n```\");\n });\n test('\"plain text\" language maps to \"text\" (#47)', async () => {\n expect(await n2m.blockToMarkdown(code([\"hello\"], \"plain text\"))).toBe(\n \"```text\\nhello\\n```\"\n );\n });\n});\n\ndescribe(\"numbered lists from caller-fetched blocks (#166)\", () => {\n const item = (id: string, content: string) =>\n ({\n object: \"block\", id, type: \"numbered_list_item\", has_children: false,\n numbered_list_item: {\n rich_text: [{\n type: \"text\", text: { content, link: null }, plain_text: content,\n href: null,\n annotations: {\n bold: false, italic: false, strikethrough: false,\n underline: false, code: false, color: \"default\",\n },\n }],\n color: \"default\",\n },\n } as any);\n const n2m = new NotionToMarkdown({ notionClient: {} as any });\n\n test(\"blocksToMarkdown numbers items that have no number yet\", async () => {\n const out = n2m.toMarkdownString(\n await n2m.blocksToMarkdown([item(\"a\", \"Buy milk\"), item(\"b\", \"Call mom\")])\n ).parent;\n expect(out).toContain(\"1. Buy milk\");\n expect(out).toContain(\"2. Call mom\");\n });\n test(\"a single block without a number falls back to 1.\", async () => {\n expect(await n2m.blockToMarkdown(item(\"c\", \"Solo\"))).toBe(\"1. Solo\");\n });\n});\n"]}
|
package/build/types/index.d.ts
CHANGED
|
@@ -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,KAAK,EACV,yBAAyB,EAE1B,MAAM,0CAA0C,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG;IAC5B,kBAAkB,CAAC,EAAE;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,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,MAAM,SAAS,GACjB,OAAO,GACP,OAAO,GACP,MAAM,GACN,KAAK,GACL,OAAO,GACP,UAAU,GACV,OAAO,GACP,UAAU,GACV,SAAS,GACT,QAAQ,GACR,OAAO,GACP,oBAAoB,GACpB,oBAAoB,GACpB,cAAc,GACd,aAAa,GACb,QAAQ,GACR,cAAc,GACd,cAAc,GACd,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,oBAAoB,GACpB,oBAAoB,GACpB,OAAO,GACP,OAAO,GACP,UAAU,GACV,cAAc,GACd,YAAY,GACZ,gBAAgB,GAChB,MAAM,GACN,SAAS,GACT,YAAY,GACZ,mBAAmB,GACnB,cAAc,GACd,OAAO,GACP,aAAa,GACb,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,oBAAoB,GAAG;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/build/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { Client } from \"@notionhq/client\";\nimport type {\n ListBlockChildrenResponse,\n GetBlockParameters,\n} from \"@notionhq/client/build/src/api-endpoints\";\n\nexport type BlockAttributes = {\n numbered_list_item?: {\n number?: number;\n };\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 BlockType =\n | \"image\"\n | \"video\"\n | \"file\"\n | \"pdf\"\n | \"table\"\n | \"bookmark\"\n | \"embed\"\n | \"equation\"\n | \"divider\"\n | \"toggle\"\n | \"to_do\"\n | \"bulleted_list_item\"\n | \"numbered_list_item\"\n | \"synced_block\"\n | \"column_list\"\n | \"column\"\n | \"link_preview\"\n | \"link_to_page\"\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 | (string & {});\n\nexport type ConfigurationOptions = {\n separateChildPage?: boolean;\n convertImagesToBase64?: boolean;\n parseChildPages?: boolean;\n};\nexport interface NotionToMarkdownOptions {\n notionClient: Client;\n config?: ConfigurationOptions;\n}\n\nexport type MdStringObject = Record<string, string>;\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 | \"default_background\"\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 | { type: \"custom_emoji\"; custom_emoji: { id: string; name: string; url: string } }\n | null;\n\nexport type CustomTransformer = (\n block: ListBlockChildrenResponseResult,\n) => string | boolean | Promise<string | boolean>;\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { Client } from \"@notionhq/client\";\nimport type {\n ListBlockChildrenResponse,\n GetBlockParameters,\n} from \"@notionhq/client/build/src/api-endpoints\";\n\nexport type BlockAttributes = {\n numbered_list_item?: {\n number?: number;\n };\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 BlockType =\n | \"image\"\n | \"video\"\n | \"file\"\n | \"pdf\"\n | \"table\"\n | \"bookmark\"\n | \"embed\"\n | \"equation\"\n | \"divider\"\n | \"toggle\"\n | \"to_do\"\n | \"bulleted_list_item\"\n | \"numbered_list_item\"\n | \"synced_block\"\n | \"column_list\"\n | \"column\"\n | \"link_preview\"\n | \"link_to_page\"\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 | (string & {});\n\nexport type ConfigurationOptions = {\n separateChildPage?: boolean;\n convertImagesToBase64?: boolean;\n parseChildPages?: boolean;\n escapeMarkdown?: boolean;\n};\nexport interface NotionToMarkdownOptions {\n notionClient: Client;\n config?: ConfigurationOptions;\n}\n\nexport type MdStringObject = Record<string, string>;\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 | \"default_background\"\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 | { type: \"custom_emoji\"; custom_emoji: { id: string; name: string; url: string } }\n | null;\n\nexport type CustomTransformer = (\n block: ListBlockChildrenResponseResult,\n) => string | boolean | Promise<string | boolean>;\n"]}
|
package/build/utils/md.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { CalloutIcon } from "../types";
|
|
2
|
+
export declare const escapeMarkdown: (text: string) => string;
|
|
3
|
+
export declare const escapeHtml: (text: string) => string;
|
|
2
4
|
export declare const inlineCode: (text: string) => string;
|
|
3
5
|
export declare const inlineEquation: (text: string) => string;
|
|
4
6
|
export declare const bold: (text: string) => string;
|
package/build/utils/md.d.ts.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"md.d.ts","sourceRoot":"","sources":["../../src/utils/md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAUvC,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,MAM7C,CAAC;AAWF,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAKzC,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,MAAM,WAQtC,CAAC;AAEF,eAAO,MAAM,cAAc,SAAU,MAAM,WAE1C,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,WAWxD,CAAC;AAEF,eAAO,MAAM,QAAQ,SAAU,MAAM,WAIpC,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,WAgBvD,CAAC;AAEF,eAAO,MAAM,MAAM,SAAU,MAAM,UAAU,MAAM,WAGlD,CAAC;AAEF,eAAO,MAAM,IAAI,SAAU,MAAM,WAAW,OAAO,WAElD,CAAC;AAEF,eAAO,MAAM,KAAK,QACX,MAAM,QACL,MAAM,oBACK,OAAO,KACvB,QAAQ,MAAM,CAuBhB,CAAC;AAEF,eAAO,MAAM,WAAW,SAAU,MAAM,uBASvC,CAAC;AAEF,eAAO,MAAM,OAAO,cAEnB,CAAC;AAEF,eAAO,MAAM,MAAM,aAAc,MAAM,aAAa,MAAM,WAMzD,CAAC;AAEF,eAAO,MAAM,KAAK,UAAW,MAAM,EAAE,EAAE,WAEtC,CAAC"}
|
package/build/utils/md.js
CHANGED
|
@@ -3,11 +3,41 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.table = exports.toggle = exports.divider = exports.addTabSpace = exports.image = exports.todo = exports.bullet = exports.callout = exports.quote = exports.heading3 = exports.heading2 = exports.heading1 = exports.equation = exports.codeBlock = exports.link = exports.underline = exports.strikethrough = exports.italic = exports.bold = exports.inlineEquation = exports.inlineCode = void 0;
|
|
6
|
+
exports.table = exports.toggle = exports.divider = exports.addTabSpace = exports.image = exports.todo = exports.bullet = exports.callout = exports.quote = exports.heading3 = exports.heading2 = exports.heading1 = exports.equation = exports.codeBlock = exports.link = exports.underline = exports.strikethrough = exports.italic = exports.bold = exports.inlineEquation = exports.inlineCode = exports.escapeHtml = exports.escapeMarkdown = void 0;
|
|
7
7
|
const markdown_table_1 = __importDefault(require("markdown-table"));
|
|
8
8
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
9
|
+
const longestBacktickRun = (text) => {
|
|
10
|
+
const runs = text.match(/`+/g);
|
|
11
|
+
return runs ? Math.max(...runs.map((run) => run.length)) : 0;
|
|
12
|
+
};
|
|
13
|
+
const escapeMarkdown = (text) => {
|
|
14
|
+
const urlPattern = /(https?:\/\/[^\s<>]+|www\.[^\s<>]+)/;
|
|
15
|
+
return text
|
|
16
|
+
.split(urlPattern)
|
|
17
|
+
.map((part, i) => (i % 2 === 1 ? part : escapeMarkdownSyntax(part)))
|
|
18
|
+
.join("");
|
|
19
|
+
};
|
|
20
|
+
exports.escapeMarkdown = escapeMarkdown;
|
|
21
|
+
const escapeMarkdownSyntax = (text) => {
|
|
22
|
+
return (text
|
|
23
|
+
.replace(/([\\`*_[\]<>~|&])/g, "\\$1")
|
|
24
|
+
.replace(/(^|\n)([ \t]*)([#>+=-])/g, "$1$2\\$3")
|
|
25
|
+
.replace(/(^|\n)([ \t]*\d+)([.)])/g, "$1$2\\$3"));
|
|
26
|
+
};
|
|
27
|
+
const escapeHtml = (text) => {
|
|
28
|
+
return text
|
|
29
|
+
.replace(/&/g, "&")
|
|
30
|
+
.replace(/</g, "<")
|
|
31
|
+
.replace(/>/g, ">");
|
|
32
|
+
};
|
|
33
|
+
exports.escapeHtml = escapeHtml;
|
|
9
34
|
const inlineCode = (text) => {
|
|
10
|
-
|
|
35
|
+
const fence = "`".repeat(longestBacktickRun(text) + 1);
|
|
36
|
+
const needsPadding = text.startsWith("`") ||
|
|
37
|
+
text.endsWith("`") ||
|
|
38
|
+
(text.startsWith(" ") && text.endsWith(" ") && text.trim() !== "");
|
|
39
|
+
const content = needsPadding ? ` ${text} ` : text;
|
|
40
|
+
return `${fence}${content}${fence}`;
|
|
11
41
|
};
|
|
12
42
|
exports.inlineCode = inlineCode;
|
|
13
43
|
const inlineEquation = (text) => {
|
|
@@ -38,10 +68,14 @@ const codeBlock = (text, language) => {
|
|
|
38
68
|
if (!text)
|
|
39
69
|
return "";
|
|
40
70
|
// Ensure a valid language, default to "plaintext" if missing
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
71
|
+
let lang = language && language.trim() ? language.toLowerCase() : "plaintext";
|
|
72
|
+
if (lang === "plain text")
|
|
73
|
+
lang = "text";
|
|
74
|
+
const fence = "`".repeat(Math.max(3, longestBacktickRun(text) + 1));
|
|
75
|
+
const code = text.replace(/^(?:[ \t]*\r?\n)+/, "").replace(/\s+$/, "");
|
|
76
|
+
return `${fence}${lang}
|
|
77
|
+
${code}
|
|
78
|
+
${fence}`;
|
|
45
79
|
};
|
|
46
80
|
exports.codeBlock = codeBlock;
|
|
47
81
|
const equation = (text) => {
|
package/build/utils/md.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"md.js","sourceRoot":"","sources":["../../src/utils/md.ts"],"names":[],"mappings":";;;;;;AACA,oEAA2C;AAE3C,4DAA+B;AAExB,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;IACzC,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC,CAAC;AAFW,QAAA,UAAU,cAErB;AAEK,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE;IAC7C,OAAO,IAAI,IAAI,GAAG,CAAC;AACrB,CAAC,CAAC;AAFW,QAAA,cAAc,kBAEzB;AAEK,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE;IACnC,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC,CAAC;AAFW,QAAA,IAAI,QAEf;AAEK,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;IACrC,OAAO,IAAI,IAAI,GAAG,CAAC;AACrB,CAAC,CAAC;AAFW,QAAA,MAAM,UAEjB;AAEK,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;IAC5C,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC,CAAC;AAFW,QAAA,aAAa,iBAExB;AAEK,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;IACxC,OAAO,MAAM,IAAI,MAAM,CAAC;AAC1B,CAAC,CAAC;AAFW,QAAA,SAAS,aAEpB;AAEK,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE;IACjD,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,CAAC;AAC9B,CAAC,CAAC;AAFW,QAAA,IAAI,QAEf;AAEK,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,QAAiB,EAAE,EAAE;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,6DAA6D;IAC7D,MAAM,IAAI,GACR,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IACrE,OAAO,SAAS,IAAI;EACpB,IAAI,CAAC,IAAI,EAAE;OACN,CAAC;AACR,CAAC,CAAC;AARW,QAAA,SAAS,aAQpB;AAEK,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;IACvC,OAAO;EACP,IAAI;GACH,CAAC;AACJ,CAAC,CAAC;AAJW,QAAA,QAAQ,YAInB;AAEK,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;IACvC,OAAO,KAAK,IAAI,EAAE,CAAC;AACrB,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB;AAEK,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;IACvC,OAAO,MAAM,IAAI,EAAE,CAAC;AACtB,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB;AAEK,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;IACvC,OAAO,OAAO,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB;AAEK,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;IACpC,+CAA+C;IAC/C,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;AAC9C,CAAC,CAAC;AAHW,QAAA,KAAK,SAGhB;AAEK,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,IAAkB,EAAE,EAAE;IAC1D,IAAI,KAAyB,CAAC;IAC9B,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,OAAO,EAAE;QAC1B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;KACpB;IAED,+CAA+C;IAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACpE,IAAI,YAAY,EAAE;QAChB,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5C,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,KAAK,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,cAAc,GAAG,cAAc,EAAE,CAAC;KAC3E;IACD,OAAO,KAAK,cAAc,GAAG,aAAa,EAAE,CAAC;AAC/C,CAAC,CAAC;AAhBW,QAAA,OAAO,WAgBlB;AAEK,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE;IACrD,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;AAC/D,CAAC,CAAC;AAHW,QAAA,MAAM,UAGjB;AAEK,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAgB,EAAE,EAAE;IACrD,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;AACrD,CAAC,CAAC;AAFW,QAAA,IAAI,QAEf;AAEK,MAAM,KAAK,GAAG,KAAK,EACxB,GAAW,EACX,IAAY,EACZ,kBAA2B,KAAK,EACf,EAAE;IACnB,iEAAiE;IACjE,iCAAiC;IACjC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAChD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;YAC5B,sEAAsE;YACtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAErC,sDAAsD;YACtD,iDAAiD;YACjD,OAAO,KAAK,GAAG,2BAA2B,MAAM,GAAG,CAAC;SACrD;QAED,OAAO,KAAK,GAAG,KAAK,IAAI,GAAG,CAAC;KAC7B;SAAM;QACL,yDAAyD;QACzD,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAK,EAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEnD,OAAO,KAAK,GAAG,2BAA2B,MAAM,GAAG,CAAC;KACrD;AACH,CAAC,CAAC;AA3BW,QAAA,KAAK,SA2BhB;AAEK,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;YAC9D,IAAI,GAAG,GAAG,GAAG,aAAa,CAAC;SAC5B;;YAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;KAC1B;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AATW,QAAA,WAAW,eAStB;AAEK,MAAM,OAAO,GAAG,GAAG,EAAE;IAC1B,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAFW,QAAA,OAAO,WAElB;AAEK,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAE,QAAiB,EAAE,EAAE;IAC5D,IAAI,CAAC,OAAO;QAAE,OAAO,QAAQ,IAAI,EAAE,CAAC;IACpC,OAAO;WACE,OAAO;EAChB,QAAQ,IAAI,EAAE;eACD,CAAC;AAChB,CAAC,CAAC;AANW,QAAA,MAAM,UAMjB;AAEK,MAAM,KAAK,GAAG,CAAC,KAAiB,EAAE,EAAE;IACzC,OAAO,IAAA,wBAAa,EAAC,KAAK,CAAC,CAAC;AAC9B,CAAC,CAAC;AAFW,QAAA,KAAK,SAEhB","sourcesContent":["import { CalloutIcon } from \"../types\";\nimport markdownTable from \"markdown-table\";\n\nimport fetch from \"node-fetch\";\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 (!text) return \"\";\n // Ensure a valid language, default to \"plaintext\" if missing\n const lang =\n language && language.trim() ? language.toLowerCase() : \"plaintext\";\n return `\\`\\`\\`${lang}\n${text.trim()}\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 const formattedText = text.replace(/\\n/g, \" \\n> \");\n const formattedEmoji = emoji ? emoji + \" \" : \"\";\n const headingMatch = formattedText.match(/^(#{1,6})\\s+([.*\\s\\S]+)/);\n if (headingMatch) {\n const headingLevel = headingMatch[1].length;\n const headingContent = headingMatch[2];\n return `> ${\"#\".repeat(headingLevel)} ${formattedEmoji}${headingContent}`;\n }\n return `> ${formattedEmoji}${formattedText}`;\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 = async (\n alt: string,\n href: string,\n convertToBase64: boolean = false,\n): Promise<string> => {\n // In case the user does not want to convert the images to Base64\n // or the image is already base64\n if (!convertToBase64 || href.startsWith(\"data:\")) {\n if (href.startsWith(\"data:\")) {\n // Extract base64 data, i.e. the string after 'data:mime/type;base64,'\n const base64 = href.split(\",\").pop();\n\n // This overrides incorrect data: string format to png\n // so that browsers can correctly render the data\n return ``;\n }\n\n return ``;\n } else {\n // Otherwise, download the image and convert it to base64\n const res = await fetch(href);\n const buf = await res.arrayBuffer();\n\n const base64 = Buffer.from(buf).toString(\"base64\");\n\n return ``;\n }\n};\n\nexport const addTabSpace = (text: string, n = 0) => {\n const tab = \" \";\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${children || \"\"}\n</details>\\n\\n`;\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\nimport fetch from \"node-fetch\";\n\nconst longestBacktickRun = (text: string): number => {\n const runs = text.match(/`+/g);\n return runs ? Math.max(...runs.map((run) => run.length)) : 0;\n};\n\nexport const escapeMarkdown = (text: string): string => {\n const urlPattern = /(https?:\\/\\/[^\\s<>]+|www\\.[^\\s<>]+)/;\n return text\n .split(urlPattern)\n .map((part, i) => (i % 2 === 1 ? part : escapeMarkdownSyntax(part)))\n .join(\"\");\n};\n\nconst escapeMarkdownSyntax = (text: string): string => {\n return (\n text\n .replace(/([\\\\`*_[\\]<>~|&])/g, \"\\\\$1\")\n .replace(/(^|\\n)([ \\t]*)([#>+=-])/g, \"$1$2\\\\$3\")\n .replace(/(^|\\n)([ \\t]*\\d+)([.)])/g, \"$1$2\\\\$3\")\n );\n};\n\nexport const escapeHtml = (text: string): string => {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n};\n\nexport const inlineCode = (text: string) => {\n const fence = \"`\".repeat(longestBacktickRun(text) + 1);\n const needsPadding =\n text.startsWith(\"`\") ||\n text.endsWith(\"`\") ||\n (text.startsWith(\" \") && text.endsWith(\" \") && text.trim() !== \"\");\n const content = needsPadding ? ` ${text} ` : text;\n return `${fence}${content}${fence}`;\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 (!text) return \"\";\n // Ensure a valid language, default to \"plaintext\" if missing\n let lang =\n language && language.trim() ? language.toLowerCase() : \"plaintext\";\n if (lang === \"plain text\") lang = \"text\";\n const fence = \"`\".repeat(Math.max(3, longestBacktickRun(text) + 1));\n const code = text.replace(/^(?:[ \\t]*\\r?\\n)+/, \"\").replace(/\\s+$/, \"\");\n return `${fence}${lang}\n${code}\n${fence}`;\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 const formattedText = text.replace(/\\n/g, \" \\n> \");\n const formattedEmoji = emoji ? emoji + \" \" : \"\";\n const headingMatch = formattedText.match(/^(#{1,6})\\s+([.*\\s\\S]+)/);\n if (headingMatch) {\n const headingLevel = headingMatch[1].length;\n const headingContent = headingMatch[2];\n return `> ${\"#\".repeat(headingLevel)} ${formattedEmoji}${headingContent}`;\n }\n return `> ${formattedEmoji}${formattedText}`;\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 = async (\n alt: string,\n href: string,\n convertToBase64: boolean = false,\n): Promise<string> => {\n // In case the user does not want to convert the images to Base64\n // or the image is already base64\n if (!convertToBase64 || href.startsWith(\"data:\")) {\n if (href.startsWith(\"data:\")) {\n // Extract base64 data, i.e. the string after 'data:mime/type;base64,'\n const base64 = href.split(\",\").pop();\n\n // This overrides incorrect data: string format to png\n // so that browsers can correctly render the data\n return ``;\n }\n\n return ``;\n } else {\n // Otherwise, download the image and convert it to base64\n const res = await fetch(href);\n const buf = await res.arrayBuffer();\n\n const base64 = Buffer.from(buf).toString(\"base64\");\n\n return ``;\n }\n};\n\nexport const addTabSpace = (text: string, n = 0) => {\n const tab = \" \";\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${children || \"\"}\n</details>\\n\\n`;\n};\n\nexport const table = (cells: string[][]) => {\n return markdownTable(cells);\n};\n"]}
|
package/build/utils/md.spec.js
CHANGED
|
@@ -102,4 +102,58 @@ describe("Toggle", () => {
|
|
|
102
102
|
expect(noSpaces((0, md_1.toggle)("title", "content"))).toBe("<details><summary>title</summary>content</details>");
|
|
103
103
|
});
|
|
104
104
|
});
|
|
105
|
+
describe("Code spans and fences (issue #176)", () => {
|
|
106
|
+
test("inline code containing a backtick uses a longer delimiter", () => {
|
|
107
|
+
expect((0, md_1.inlineCode)("a`b")).toBe("``a`b``");
|
|
108
|
+
});
|
|
109
|
+
test("inline code containing a double backtick run", () => {
|
|
110
|
+
expect((0, md_1.inlineCode)("a``b")).toBe("```a``b```");
|
|
111
|
+
});
|
|
112
|
+
test("inline code starting or ending with a backtick is padded", () => {
|
|
113
|
+
expect((0, md_1.inlineCode)("`a")).toBe("`` `a ``");
|
|
114
|
+
expect((0, md_1.inlineCode)("a`")).toBe("`` a` ``");
|
|
115
|
+
});
|
|
116
|
+
test("code block containing a ``` fence uses a longer fence", () => {
|
|
117
|
+
expect((0, md_1.codeBlock)("```\ninner\n```", "markdown")).toBe("````markdown\n```\ninner\n```\n````");
|
|
118
|
+
});
|
|
119
|
+
test("code block preserves first-line indentation", () => {
|
|
120
|
+
expect((0, md_1.codeBlock)(" indented()\nnext()", "python")).toBe("```python\n indented()\nnext()\n```");
|
|
121
|
+
});
|
|
122
|
+
test("code block still drops leading blank lines and trailing whitespace", () => {
|
|
123
|
+
expect((0, md_1.codeBlock)("\n\n x = 1\n\n", "python")).toBe("```python\n x = 1\n```");
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe("escapeMarkdown (issue #176)", () => {
|
|
127
|
+
test("escapes emphasis characters", () => {
|
|
128
|
+
expect((0, md_1.escapeMarkdown)("2*3*4 = 24")).toBe("2\\*3\\*4 = 24");
|
|
129
|
+
expect((0, md_1.escapeMarkdown)("snake_case_name")).toBe("snake\\_case\\_name");
|
|
130
|
+
});
|
|
131
|
+
test("escapes headings at line start", () => {
|
|
132
|
+
expect((0, md_1.escapeMarkdown)("# not a heading")).toBe("\\# not a heading");
|
|
133
|
+
});
|
|
134
|
+
test("escapes ordered and unordered list markers at line start", () => {
|
|
135
|
+
expect((0, md_1.escapeMarkdown)("1. not a list")).toBe("1\\. not a list");
|
|
136
|
+
expect((0, md_1.escapeMarkdown)("- not a list")).toBe("\\- not a list");
|
|
137
|
+
expect((0, md_1.escapeMarkdown)("a\n2) b")).toBe("a\n2\\) b");
|
|
138
|
+
});
|
|
139
|
+
test("escapes links, html, backslashes and pipes", () => {
|
|
140
|
+
expect((0, md_1.escapeMarkdown)("[x](y) <b> a\\b | c")).toBe("\\[x\\](y) \\<b\\> a\\\\b \\| c");
|
|
141
|
+
});
|
|
142
|
+
test("leaves ordinary text alone", () => {
|
|
143
|
+
expect((0, md_1.escapeMarkdown)("Hello, world. 3 - 2 = 1")).toBe("Hello, world. 3 - 2 = 1");
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe("escapeMarkdown edge cases", () => {
|
|
147
|
+
test("leaves bare URLs untouched so auto-links keep working", () => {
|
|
148
|
+
expect((0, md_1.escapeMarkdown)("see https://x.com/a_b?q=1*2 and a_b")).toBe("see https://x.com/a_b?q=1*2 and a\\_b");
|
|
149
|
+
expect((0, md_1.escapeMarkdown)("www.x.com/a_b")).toBe("www.x.com/a_b");
|
|
150
|
+
});
|
|
151
|
+
test("escapes entities and setext underlines", () => {
|
|
152
|
+
expect((0, md_1.escapeMarkdown)("&")).toBe("\\&");
|
|
153
|
+
expect((0, md_1.escapeMarkdown)("Title\n===")).toBe("Title\n\\===");
|
|
154
|
+
});
|
|
155
|
+
test("escapeHtml makes text safe inside raw HTML", () => {
|
|
156
|
+
expect((0, md_1.escapeHtml)("2*3 <b> & a_b")).toBe("2*3 <b> & a_b");
|
|
157
|
+
});
|
|
158
|
+
});
|
|
105
159
|
//# 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 {\n callout,\n table,\n inlineCode,\n bold,\n italic,\n strikethrough,\n underline,\n link,\n codeBlock,\n heading1,\n heading2,\n heading3,\n quote,\n bullet,\n todo,\n toggle,\n image,\n inlineEquation,\n equation,\n} from \"./md\";\n\ndescribe(\"Callout\", () => {\n test(\"parses callout without emoji\", () => {\n const text = \"Call out text content.\";\n\n expect(callout(text)).toBe(`> ${text}`);\n });\n\n test(\"parses callout with emoji\", () => {\n const text = \"Call out text content.\";\n\n expect(\n callout(text, {\n type: \"emoji\",\n emoji: \"😍\",\n })\n ).toBe(`> 😍 ${text}`);\n });\n});\n\ndescribe(\"Markdown Table\", () => {\n test(\"parse simple table to markdown table\", () => {\n const mockTable = [\n [\"number\", \"char\"],\n [\"1\", \"a\"],\n [\"2\", \"b\"],\n ];\n\n expect(table(mockTable)).toBe(\n `\n| number | char |\n| ------ | ---- |\n| 1 | a |\n| 2 | b |\n `.trim()\n );\n });\n});\n\ndescribe(\"Text Annotations\", () => {\n test(\"Inline Code\", () => {\n expect(inlineCode(\"simple text\")).toBe(\"`simple text`\");\n });\n test(\"Code Block\", () => {\n expect(codeBlock(\"simple text\", \"javascript\")).toBe(\n `\\`\\`\\`javascript\nsimple text\n\\`\\`\\``.trim()\n );\n });\n test(\"Inline Equation\", () => {\n expect(inlineEquation(\"E = mc^2\")).toBe(\"$E = mc^2$\");\n });\n test(\"Equation Block\", () => {\n expect(equation(\"E = mc^2\")).toBe(\n `$$\nE = mc^2\n$$`.trim()\n );\n });\n test(\"Bold\", () => {\n expect(bold(\"simple text\")).toBe(\"**simple text**\");\n });\n test(\"Italic\", () => {\n expect(italic(\"simple text\")).toBe(\"_simple text_\");\n });\n test(\"StrikeThrough\", () => {\n expect(strikethrough(\"simple text\")).toBe(\"~~simple text~~\");\n });\n test(\"Underline\", () => {\n expect(underline(\"simple text\")).toBe(\"<u>simple text</u>\");\n });\n});\n\ndescribe(\"Headings\", () => {\n test(\"Heading 1\", () => {\n expect(heading1(\"simple text\")).toBe(\"# simple text\");\n });\n test(\"Heading 2\", () => {\n expect(heading2(\"simple text\")).toBe(\"## simple text\");\n });\n test(\"Heading 3\", () => {\n expect(heading3(\"simple text\")).toBe(\"### simple text\");\n });\n});\n\ndescribe(\"List Elements\", () => {\n test(\"Bullet\", () => {\n expect(bullet(\"simple text\")).toBe(\"- simple text\");\n });\n\n test(\"Checked todo\", () => {\n expect(todo(\"simple text\", true)).toBe(\"- [x] simple text\");\n });\n\n test(\"Unchecked todo\", () => {\n expect(todo(\"simple text\", false)).toBe(\"- [ ] simple text\");\n });\n});\n\ndescribe(\"Image\", () => {\n test(\"Image with alt text\", async () => {\n expect(await image(\"simple text\", \"https://example.com/image\", false)).toBe(\n ``\n );\n });\n\n test(\"Image to Base64\", async () => {\n const image_markdown = await image(\n \"simple text\",\n \"https://w.wallhaven.cc/full/ex/wallhaven-ex9gwo.png\",\n true\n );\n\n expect(image_markdown).toMatch(\n `;\n });\n});\n\ndescribe(\"Toggle\", () => {\n const noSpaces = (text: string) => text.replace(/\\s+/g, \"\");\n test(\"displays content if toggle title is empty\", () => {\n expect(noSpaces(toggle(undefined, \"content\"))).toBe(\"content\");\n });\n test(\"return empty string if title and content are empty\", () => {\n expect(noSpaces(toggle(undefined, undefined))).toBe(\"\");\n });\n test(\"Displays toggle with <details> and <summary>\", () => {\n expect(noSpaces(toggle(\"title\", \"content\"))).toBe(\n \"<details><summary>title</summary>content</details>\"\n );\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"md.spec.js","sourceRoot":"","sources":["../../src/utils/md.spec.ts"],"names":[],"mappings":";;AAAA,6BAsBc;AAEd,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,wBAAwB,CAAC;QAEtC,MAAM,CAAC,IAAA,YAAO,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,wBAAwB,CAAC;QAEtC,MAAM,CACJ,IAAA,YAAO,EAAC,IAAI,EAAE;YACZ,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI;SACZ,CAAC,CACH,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,SAAS,GAAG;YAChB,CAAC,QAAQ,EAAE,MAAM,CAAC;YAClB,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;SACX,CAAC;QAEF,MAAM,CAAC,IAAA,UAAK,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAC3B;;;;;KAKD,CAAC,IAAI,EAAE,CACP,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;QACvB,MAAM,CAAC,IAAA,eAAU,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;QACtB,MAAM,CAAC,IAAA,cAAS,EAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CACjD;;OAEC,CAAC,IAAI,EAAE,CACT,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,IAAA,mBAAc,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,IAAA,aAAQ,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAC/B;;GAEH,CAAC,IAAI,EAAE,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAChB,MAAM,CAAC,IAAA,SAAI,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;QAClB,MAAM,CAAC,IAAA,WAAM,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,IAAA,kBAAa,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,MAAM,CAAC,IAAA,cAAS,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,MAAM,CAAC,IAAA,aAAQ,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,MAAM,CAAC,IAAA,aAAQ,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,MAAM,CAAC,IAAA,aAAQ,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;QAClB,MAAM,CAAC,IAAA,WAAM,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,IAAA,SAAI,EAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,IAAA,SAAI,EAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,IAAI,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,CAAC,MAAM,IAAA,UAAK,EAAC,aAAa,EAAE,2BAA2B,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CACzE,2CAA2C,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,cAAc,GAAG,MAAM,IAAA,UAAK,EAChC,aAAa,EACb,qDAAqD,EACrD,IAAI,CACL,CAAC;QAEF,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAC5B,0GAA0G,CAC3G,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,QAAQ,CAAC,IAAA,WAAM,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,QAAQ,CAAC,IAAA,WAAM,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,QAAQ,CAAC,IAAA,WAAM,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAC/C,oDAAoD,CACrD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,IAAA,eAAU,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,IAAA,eAAU,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,IAAA,cAAS,EAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CACnD,qCAAqC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,IAAA,cAAS,EAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CACxD,wCAAwC,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,IAAA,cAAS,EAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CACjD,yBAAyB,CAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,IAAA,mBAAc,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAA,mBAAc,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,IAAA,mBAAc,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,IAAA,mBAAc,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChE,MAAM,CAAC,IAAA,mBAAc,EAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAA,mBAAc,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,IAAA,mBAAc,EAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAChD,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,IAAA,mBAAc,EAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CACpD,yBAAyB,CAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,IAAA,mBAAc,EAAC,qCAAqC,CAAC,CAAC,CAAC,IAAI,CAChE,uCAAuC,CACxC,CAAC;QACF,MAAM,CAAC,IAAA,mBAAc,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,IAAA,mBAAc,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,IAAA,mBAAc,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,IAAA,eAAU,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import {\n callout,\n table,\n inlineCode,\n bold,\n italic,\n strikethrough,\n underline,\n link,\n codeBlock,\n heading1,\n heading2,\n heading3,\n quote,\n bullet,\n todo,\n toggle,\n image,\n inlineEquation,\n equation,\n escapeMarkdown,\n escapeHtml,\n} from \"./md\";\n\ndescribe(\"Callout\", () => {\n test(\"parses callout without emoji\", () => {\n const text = \"Call out text content.\";\n\n expect(callout(text)).toBe(`> ${text}`);\n });\n\n test(\"parses callout with emoji\", () => {\n const text = \"Call out text content.\";\n\n expect(\n callout(text, {\n type: \"emoji\",\n emoji: \"😍\",\n })\n ).toBe(`> 😍 ${text}`);\n });\n});\n\ndescribe(\"Markdown Table\", () => {\n test(\"parse simple table to markdown table\", () => {\n const mockTable = [\n [\"number\", \"char\"],\n [\"1\", \"a\"],\n [\"2\", \"b\"],\n ];\n\n expect(table(mockTable)).toBe(\n `\n| number | char |\n| ------ | ---- |\n| 1 | a |\n| 2 | b |\n `.trim()\n );\n });\n});\n\ndescribe(\"Text Annotations\", () => {\n test(\"Inline Code\", () => {\n expect(inlineCode(\"simple text\")).toBe(\"`simple text`\");\n });\n test(\"Code Block\", () => {\n expect(codeBlock(\"simple text\", \"javascript\")).toBe(\n `\\`\\`\\`javascript\nsimple text\n\\`\\`\\``.trim()\n );\n });\n test(\"Inline Equation\", () => {\n expect(inlineEquation(\"E = mc^2\")).toBe(\"$E = mc^2$\");\n });\n test(\"Equation Block\", () => {\n expect(equation(\"E = mc^2\")).toBe(\n `$$\nE = mc^2\n$$`.trim()\n );\n });\n test(\"Bold\", () => {\n expect(bold(\"simple text\")).toBe(\"**simple text**\");\n });\n test(\"Italic\", () => {\n expect(italic(\"simple text\")).toBe(\"_simple text_\");\n });\n test(\"StrikeThrough\", () => {\n expect(strikethrough(\"simple text\")).toBe(\"~~simple text~~\");\n });\n test(\"Underline\", () => {\n expect(underline(\"simple text\")).toBe(\"<u>simple text</u>\");\n });\n});\n\ndescribe(\"Headings\", () => {\n test(\"Heading 1\", () => {\n expect(heading1(\"simple text\")).toBe(\"# simple text\");\n });\n test(\"Heading 2\", () => {\n expect(heading2(\"simple text\")).toBe(\"## simple text\");\n });\n test(\"Heading 3\", () => {\n expect(heading3(\"simple text\")).toBe(\"### simple text\");\n });\n});\n\ndescribe(\"List Elements\", () => {\n test(\"Bullet\", () => {\n expect(bullet(\"simple text\")).toBe(\"- simple text\");\n });\n\n test(\"Checked todo\", () => {\n expect(todo(\"simple text\", true)).toBe(\"- [x] simple text\");\n });\n\n test(\"Unchecked todo\", () => {\n expect(todo(\"simple text\", false)).toBe(\"- [ ] simple text\");\n });\n});\n\ndescribe(\"Image\", () => {\n test(\"Image with alt text\", async () => {\n expect(await image(\"simple text\", \"https://example.com/image\", false)).toBe(\n ``\n );\n });\n\n test(\"Image to Base64\", async () => {\n const image_markdown = await image(\n \"simple text\",\n \"https://w.wallhaven.cc/full/ex/wallhaven-ex9gwo.png\",\n true\n );\n\n expect(image_markdown).toMatch(\n `;\n });\n});\n\ndescribe(\"Toggle\", () => {\n const noSpaces = (text: string) => text.replace(/\\s+/g, \"\");\n test(\"displays content if toggle title is empty\", () => {\n expect(noSpaces(toggle(undefined, \"content\"))).toBe(\"content\");\n });\n test(\"return empty string if title and content are empty\", () => {\n expect(noSpaces(toggle(undefined, undefined))).toBe(\"\");\n });\n test(\"Displays toggle with <details> and <summary>\", () => {\n expect(noSpaces(toggle(\"title\", \"content\"))).toBe(\n \"<details><summary>title</summary>content</details>\"\n );\n });\n});\n\ndescribe(\"Code spans and fences (issue #176)\", () => {\n test(\"inline code containing a backtick uses a longer delimiter\", () => {\n expect(inlineCode(\"a`b\")).toBe(\"``a`b``\");\n });\n test(\"inline code containing a double backtick run\", () => {\n expect(inlineCode(\"a``b\")).toBe(\"```a``b```\");\n });\n test(\"inline code starting or ending with a backtick is padded\", () => {\n expect(inlineCode(\"`a\")).toBe(\"`` `a ``\");\n expect(inlineCode(\"a`\")).toBe(\"`` a` ``\");\n });\n test(\"code block containing a ``` fence uses a longer fence\", () => {\n expect(codeBlock(\"```\\ninner\\n```\", \"markdown\")).toBe(\n \"````markdown\\n```\\ninner\\n```\\n````\"\n );\n });\n test(\"code block preserves first-line indentation\", () => {\n expect(codeBlock(\" indented()\\nnext()\", \"python\")).toBe(\n \"```python\\n indented()\\nnext()\\n```\"\n );\n });\n test(\"code block still drops leading blank lines and trailing whitespace\", () => {\n expect(codeBlock(\"\\n\\n x = 1\\n\\n\", \"python\")).toBe(\n \"```python\\n x = 1\\n```\"\n );\n });\n});\n\ndescribe(\"escapeMarkdown (issue #176)\", () => {\n test(\"escapes emphasis characters\", () => {\n expect(escapeMarkdown(\"2*3*4 = 24\")).toBe(\"2\\\\*3\\\\*4 = 24\");\n expect(escapeMarkdown(\"snake_case_name\")).toBe(\"snake\\\\_case\\\\_name\");\n });\n test(\"escapes headings at line start\", () => {\n expect(escapeMarkdown(\"# not a heading\")).toBe(\"\\\\# not a heading\");\n });\n test(\"escapes ordered and unordered list markers at line start\", () => {\n expect(escapeMarkdown(\"1. not a list\")).toBe(\"1\\\\. not a list\");\n expect(escapeMarkdown(\"- not a list\")).toBe(\"\\\\- not a list\");\n expect(escapeMarkdown(\"a\\n2) b\")).toBe(\"a\\n2\\\\) b\");\n });\n test(\"escapes links, html, backslashes and pipes\", () => {\n expect(escapeMarkdown(\"[x](y) <b> a\\\\b | c\")).toBe(\n \"\\\\[x\\\\](y) \\\\<b\\\\> a\\\\\\\\b \\\\| c\"\n );\n });\n test(\"leaves ordinary text alone\", () => {\n expect(escapeMarkdown(\"Hello, world. 3 - 2 = 1\")).toBe(\n \"Hello, world. 3 - 2 = 1\"\n );\n });\n});\n\ndescribe(\"escapeMarkdown edge cases\", () => {\n test(\"leaves bare URLs untouched so auto-links keep working\", () => {\n expect(escapeMarkdown(\"see https://x.com/a_b?q=1*2 and a_b\")).toBe(\n \"see https://x.com/a_b?q=1*2 and a\\\\_b\"\n );\n expect(escapeMarkdown(\"www.x.com/a_b\")).toBe(\"www.x.com/a_b\");\n });\n test(\"escapes entities and setext underlines\", () => {\n expect(escapeMarkdown(\"&\")).toBe(\"\\\\&\");\n expect(escapeMarkdown(\"Title\\n===\")).toBe(\"Title\\n\\\\===\");\n });\n test(\"escapeHtml makes text safe inside raw HTML\", () => {\n expect(escapeHtml(\"2*3 <b> & a_b\")).toBe(\"2*3 <b> & a_b\");\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "notion-to-md",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.10",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=12"
|
|
6
6
|
},
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"@notionhq/client": "^2.2.15",
|
|
42
42
|
"@types/jest": "^27.4.1",
|
|
43
43
|
"@types/markdown-table": "^2.0.0",
|
|
44
|
+
"@types/node": "^18.19.0",
|
|
44
45
|
"jest": "^27.5.1",
|
|
45
46
|
"ts-jest": "^27.1.3",
|
|
46
47
|
"typescript": "^4.5.4"
|