pd-markdown 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/package.json +26 -0
  2. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.d.ts +4 -0
  3. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.d.ts.map +1 -0
  4. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.js +5 -0
  5. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.js.map +1 -0
  6. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.d.ts +4 -0
  7. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.d.ts.map +1 -0
  8. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.js +4 -0
  9. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.js.map +1 -0
  10. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.d.ts +6 -0
  11. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.d.ts.map +1 -0
  12. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.js +36 -0
  13. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.js.map +1 -0
  14. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.d.ts +14 -0
  15. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.d.ts.map +1 -0
  16. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.js +18 -0
  17. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.js.map +1 -0
  18. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.d.ts +27 -0
  19. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.d.ts.map +1 -0
  20. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.js +37 -0
  21. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.js.map +1 -0
  22. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.d.ts +22 -0
  23. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.d.ts.map +1 -0
  24. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.js +95 -0
  25. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.js.map +1 -0
  26. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.d.ts +55 -0
  27. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.d.ts.map +1 -0
  28. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.js +2 -0
  29. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.js.map +1 -0
  30. package/packages/parser/__tests__/frontmatter.test.ts +69 -0
  31. package/packages/parser/__tests__/gfm.test.ts +83 -0
  32. package/packages/parser/__tests__/processor.test.ts +136 -0
  33. package/packages/parser/__tests__/transform/heading.test.ts +56 -0
  34. package/packages/parser/__tests__/transform/list.test.ts +67 -0
  35. package/packages/parser/__tests__/transform/table.test.ts +85 -0
  36. package/packages/parser/dist/index.cjs +191 -0
  37. package/packages/parser/dist/index.cjs.map +1 -0
  38. package/packages/parser/dist/index.d.ts +4 -0
  39. package/packages/parser/dist/index.d.ts.map +1 -0
  40. package/packages/parser/dist/index.mjs +185 -0
  41. package/packages/parser/dist/index.mjs.map +1 -0
  42. package/packages/parser/dist/plugins/index.d.ts +4 -0
  43. package/packages/parser/dist/plugins/index.d.ts.map +1 -0
  44. package/packages/parser/dist/plugins/transform/heading.d.ts +6 -0
  45. package/packages/parser/dist/plugins/transform/heading.d.ts.map +1 -0
  46. package/packages/parser/dist/plugins/transform/list.d.ts +14 -0
  47. package/packages/parser/dist/plugins/transform/list.d.ts.map +1 -0
  48. package/packages/parser/dist/plugins/transform/table.d.ts +27 -0
  49. package/packages/parser/dist/plugins/transform/table.d.ts.map +1 -0
  50. package/packages/parser/dist/processor.d.ts +22 -0
  51. package/packages/parser/dist/processor.d.ts.map +1 -0
  52. package/packages/parser/dist/types/index.d.ts +55 -0
  53. package/packages/parser/dist/types/index.d.ts.map +1 -0
  54. package/packages/parser/node_modules/.bin/yaml +17 -0
  55. package/packages/parser/package.json +38 -0
  56. package/packages/parser/rollup.config.ts +38 -0
  57. package/packages/parser/src/index.ts +15 -0
  58. package/packages/parser/src/plugins/index.ts +3 -0
  59. package/packages/parser/src/plugins/transform/heading.ts +40 -0
  60. package/packages/parser/src/plugins/transform/list.ts +29 -0
  61. package/packages/parser/src/plugins/transform/table.ts +62 -0
  62. package/packages/parser/src/processor.ts +119 -0
  63. package/packages/parser/src/types/index.ts +60 -0
  64. package/packages/parser/tsconfig.json +9 -0
  65. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.d.ts +36 -0
  66. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.d.ts.map +1 -0
  67. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.js +99 -0
  68. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.js.map +1 -0
  69. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.d.ts +22 -0
  70. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.d.ts.map +1 -0
  71. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.js +46 -0
  72. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.js.map +1 -0
  73. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.d.ts +7 -0
  74. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.d.ts.map +1 -0
  75. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.js +8 -0
  76. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.js.map +1 -0
  77. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.d.ts +22 -0
  78. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.d.ts.map +1 -0
  79. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.js +140 -0
  80. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.js.map +1 -0
  81. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.d.ts +16 -0
  82. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.d.ts.map +1 -0
  83. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.js +39 -0
  84. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.js.map +1 -0
  85. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.d.ts +49 -0
  86. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.d.ts.map +1 -0
  87. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.js +19 -0
  88. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.js.map +1 -0
  89. package/packages/utils/__tests__/query.test.ts +155 -0
  90. package/packages/utils/__tests__/sanitize.test.ts +96 -0
  91. package/packages/utils/__tests__/slugify.test.ts +71 -0
  92. package/packages/utils/__tests__/traverse.test.ts +131 -0
  93. package/packages/utils/dist/ast/query.d.ts +36 -0
  94. package/packages/utils/dist/ast/query.d.ts.map +1 -0
  95. package/packages/utils/dist/ast/traverse.d.ts +22 -0
  96. package/packages/utils/dist/ast/traverse.d.ts.map +1 -0
  97. package/packages/utils/dist/index.cjs +358 -0
  98. package/packages/utils/dist/index.cjs.map +1 -0
  99. package/packages/utils/dist/index.d.ts +7 -0
  100. package/packages/utils/dist/index.d.ts.map +1 -0
  101. package/packages/utils/dist/index.mjs +343 -0
  102. package/packages/utils/dist/index.mjs.map +1 -0
  103. package/packages/utils/dist/string/sanitize.d.ts +22 -0
  104. package/packages/utils/dist/string/sanitize.d.ts.map +1 -0
  105. package/packages/utils/dist/string/slugify.d.ts +16 -0
  106. package/packages/utils/dist/string/slugify.d.ts.map +1 -0
  107. package/packages/utils/dist/types/index.d.ts +49 -0
  108. package/packages/utils/dist/types/index.d.ts.map +1 -0
  109. package/packages/utils/package.json +27 -0
  110. package/packages/utils/rollup.config.ts +26 -0
  111. package/packages/utils/src/ast/query.ts +127 -0
  112. package/packages/utils/src/ast/traverse.ts +73 -0
  113. package/packages/utils/src/index.ts +20 -0
  114. package/packages/utils/src/string/sanitize.ts +155 -0
  115. package/packages/utils/src/string/slugify.ts +43 -0
  116. package/packages/utils/src/types/index.ts +72 -0
  117. package/packages/utils/tsconfig.json +8 -0
  118. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.d.ts +27 -0
  119. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.d.ts.map +1 -0
  120. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.js +39 -0
  121. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.js.map +1 -0
  122. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.d.ts +10 -0
  123. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.d.ts.map +1 -0
  124. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.js +130 -0
  125. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.js.map +1 -0
  126. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.d.ts +17 -0
  127. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.d.ts.map +1 -0
  128. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.js +14 -0
  129. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.js.map +1 -0
  130. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.d.ts +8 -0
  131. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.d.ts.map +1 -0
  132. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.js +5 -0
  133. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.js.map +1 -0
  134. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.d.ts +13 -0
  135. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.d.ts.map +1 -0
  136. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.js +9 -0
  137. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.js.map +1 -0
  138. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.d.ts +8 -0
  139. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.d.ts.map +1 -0
  140. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.js +7 -0
  141. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.js.map +1 -0
  142. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.d.ts +7 -0
  143. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.d.ts.map +1 -0
  144. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.js +5 -0
  145. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.js.map +1 -0
  146. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.d.ts +8 -0
  147. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.d.ts.map +1 -0
  148. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.js +7 -0
  149. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.js.map +1 -0
  150. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.d.ts +13 -0
  151. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.d.ts.map +1 -0
  152. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.js +14 -0
  153. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.js.map +1 -0
  154. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.d.ts +8 -0
  155. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.d.ts.map +1 -0
  156. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.js +5 -0
  157. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.js.map +1 -0
  158. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.d.ts +19 -0
  159. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.d.ts.map +1 -0
  160. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.js +18 -0
  161. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.js.map +1 -0
  162. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.d.ts +34 -0
  163. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.d.ts.map +1 -0
  164. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.js +28 -0
  165. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.js.map +1 -0
  166. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.d.ts +11 -0
  167. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.d.ts.map +1 -0
  168. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.js +28 -0
  169. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.js.map +1 -0
  170. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.d.ts +6 -0
  171. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.d.ts.map +1 -0
  172. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.js +9 -0
  173. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.js.map +1 -0
  174. package/packages/web/__tests__/MarkdownRenderer.test.tsx +89 -0
  175. package/packages/web/__tests__/NodeRenderer.test.tsx +97 -0
  176. package/packages/web/__tests__/components/Code.test.tsx +71 -0
  177. package/packages/web/__tests__/components/Heading.test.tsx +65 -0
  178. package/packages/web/__tests__/components/List.test.tsx +100 -0
  179. package/packages/web/__tests__/components/Table.test.tsx +105 -0
  180. package/packages/web/__tests__/useMarkdown.test.ts +63 -0
  181. package/packages/web/dist/components/MarkdownRenderer.d.ts +27 -0
  182. package/packages/web/dist/components/MarkdownRenderer.d.ts.map +1 -0
  183. package/packages/web/dist/components/NodeRenderer.d.ts +10 -0
  184. package/packages/web/dist/components/NodeRenderer.d.ts.map +1 -0
  185. package/packages/web/dist/components/context.d.ts +17 -0
  186. package/packages/web/dist/components/context.d.ts.map +1 -0
  187. package/packages/web/dist/components/defaults/Blockquote.d.ts +8 -0
  188. package/packages/web/dist/components/defaults/Blockquote.d.ts.map +1 -0
  189. package/packages/web/dist/components/defaults/Code.d.ts +13 -0
  190. package/packages/web/dist/components/defaults/Code.d.ts.map +1 -0
  191. package/packages/web/dist/components/defaults/Heading.d.ts +8 -0
  192. package/packages/web/dist/components/defaults/Heading.d.ts.map +1 -0
  193. package/packages/web/dist/components/defaults/Image.d.ts +7 -0
  194. package/packages/web/dist/components/defaults/Image.d.ts.map +1 -0
  195. package/packages/web/dist/components/defaults/Link.d.ts +8 -0
  196. package/packages/web/dist/components/defaults/Link.d.ts.map +1 -0
  197. package/packages/web/dist/components/defaults/List.d.ts +13 -0
  198. package/packages/web/dist/components/defaults/List.d.ts.map +1 -0
  199. package/packages/web/dist/components/defaults/Paragraph.d.ts +8 -0
  200. package/packages/web/dist/components/defaults/Paragraph.d.ts.map +1 -0
  201. package/packages/web/dist/components/defaults/Table.d.ts +19 -0
  202. package/packages/web/dist/components/defaults/Table.d.ts.map +1 -0
  203. package/packages/web/dist/components/defaults/index.d.ts +34 -0
  204. package/packages/web/dist/components/defaults/index.d.ts.map +1 -0
  205. package/packages/web/dist/hooks/useMarkdown.d.ts +11 -0
  206. package/packages/web/dist/hooks/useMarkdown.d.ts.map +1 -0
  207. package/packages/web/dist/index.cjs +306 -0
  208. package/packages/web/dist/index.cjs.map +1 -0
  209. package/packages/web/dist/index.d.ts +6 -0
  210. package/packages/web/dist/index.d.ts.map +1 -0
  211. package/packages/web/dist/index.mjs +287 -0
  212. package/packages/web/dist/index.mjs.map +1 -0
  213. package/packages/web/package.json +40 -0
  214. package/packages/web/rollup.config.ts +36 -0
  215. package/packages/web/src/components/MarkdownRenderer.tsx +70 -0
  216. package/packages/web/src/components/NodeRenderer.tsx +205 -0
  217. package/packages/web/src/components/context.ts +24 -0
  218. package/packages/web/src/components/defaults/Blockquote.tsx +11 -0
  219. package/packages/web/src/components/defaults/Code.tsx +26 -0
  220. package/packages/web/src/components/defaults/Heading.tsx +14 -0
  221. package/packages/web/src/components/defaults/Image.tsx +10 -0
  222. package/packages/web/src/components/defaults/Link.tsx +18 -0
  223. package/packages/web/src/components/defaults/List.tsx +33 -0
  224. package/packages/web/src/components/defaults/Paragraph.tsx +11 -0
  225. package/packages/web/src/components/defaults/Table.tsx +50 -0
  226. package/packages/web/src/components/defaults/index.tsx +80 -0
  227. package/packages/web/src/hooks/useMarkdown.ts +32 -0
  228. package/packages/web/src/index.ts +37 -0
  229. package/packages/web/tsconfig.json +11 -0
  230. package/packages/web/vitest.config.ts +9 -0
  231. package/pnpm-workspace.yaml +2 -0
  232. package/tsconfig.base.json +26 -0
  233. package/tsconfig.json +8 -0
  234. package/vitest.config.ts +28 -0
  235. package/vitest.setup.ts +1 -0
@@ -0,0 +1,343 @@
1
+ /**
2
+ * Type guard to check if node is a parent node
3
+ */
4
+ function isParent(node) {
5
+ return 'children' in node && Array.isArray(node.children);
6
+ }
7
+ /**
8
+ * Type guard to check if node is a literal node
9
+ */
10
+ function isLiteral(node) {
11
+ return 'value' in node && typeof node.value === 'string';
12
+ }
13
+ /**
14
+ * Type guard to check if node has specific type
15
+ */
16
+ function isNodeType(node, type) {
17
+ return node.type === type;
18
+ }
19
+
20
+ /**
21
+ * Traverse AST in depth-first order
22
+ *
23
+ * @param node - Root node to start traversal
24
+ * @param visitor - Visitor function called for each node
25
+ * Return `false` to skip children of current node
26
+ * Return `true` or `undefined` to continue
27
+ */
28
+ function traverseAst(node, visitor) {
29
+ function visit(current, index, parent) {
30
+ const result = visitor(current, index, parent);
31
+ // Skip children if visitor returns false
32
+ if (result === false) {
33
+ return;
34
+ }
35
+ if (isParent(current)) {
36
+ const children = current.children;
37
+ for (let i = 0; i < children.length; i++) {
38
+ visit(children[i], i, current);
39
+ }
40
+ }
41
+ }
42
+ visit(node, undefined, undefined);
43
+ }
44
+ /**
45
+ * Traverse AST with enter and leave callbacks
46
+ *
47
+ * @param node - Root node to start traversal
48
+ * @param callbacks - Object with optional enter and leave functions
49
+ */
50
+ function traverseAstWithCallbacks(node, callbacks) {
51
+ const { enter, leave } = callbacks;
52
+ function visit(current, index, parent) {
53
+ const shouldSkipChildren = enter?.(current, index, parent) === false;
54
+ if (!shouldSkipChildren && isParent(current)) {
55
+ const children = current.children;
56
+ for (let i = 0; i < children.length; i++) {
57
+ visit(children[i], i, current);
58
+ }
59
+ }
60
+ leave?.(current, index, parent);
61
+ }
62
+ visit(node, undefined, undefined);
63
+ }
64
+
65
+ /**
66
+ * Find all nodes of a specific type in the AST
67
+ *
68
+ * @param node - Root node to search from
69
+ * @param type - Node type to find
70
+ * @returns Array of matching nodes
71
+ */
72
+ function findNodes(node, type) {
73
+ const results = [];
74
+ function visit(current) {
75
+ if (current.type === type) {
76
+ results.push(current);
77
+ }
78
+ if (isParent(current)) {
79
+ for (const child of current.children) {
80
+ visit(child);
81
+ }
82
+ }
83
+ }
84
+ visit(node);
85
+ return results;
86
+ }
87
+ /**
88
+ * Find the first node of a specific type in the AST
89
+ *
90
+ * @param node - Root node to search from
91
+ * @param type - Node type to find
92
+ * @returns The first matching node or undefined
93
+ */
94
+ function findNode(node, type) {
95
+ let result;
96
+ function visit(current) {
97
+ if (current.type === type) {
98
+ result = current;
99
+ return true; // Found, stop searching
100
+ }
101
+ if (isParent(current)) {
102
+ for (const child of current.children) {
103
+ if (visit(child)) {
104
+ return true;
105
+ }
106
+ }
107
+ }
108
+ return false;
109
+ }
110
+ visit(node);
111
+ return result;
112
+ }
113
+ /**
114
+ * Find all nodes matching a predicate
115
+ *
116
+ * @param node - Root node to search from
117
+ * @param predicate - Function to test each node
118
+ * @returns Array of matching nodes
119
+ */
120
+ function findNodesBy(node, predicate) {
121
+ const results = [];
122
+ function visit(current) {
123
+ if (predicate(current)) {
124
+ results.push(current);
125
+ }
126
+ if (isParent(current)) {
127
+ for (const child of current.children) {
128
+ visit(child);
129
+ }
130
+ }
131
+ }
132
+ visit(node);
133
+ return results;
134
+ }
135
+ /**
136
+ * Get the parent of a node in the AST
137
+ * Note: This requires traversing from root, use sparingly
138
+ *
139
+ * @param root - Root node of the AST
140
+ * @param target - Node to find parent of
141
+ * @returns Parent node or undefined if not found or is root
142
+ */
143
+ function findParent(root, target) {
144
+ let result;
145
+ function visit(current, parent) {
146
+ if (current === target) {
147
+ result = parent;
148
+ return true;
149
+ }
150
+ if (isParent(current)) {
151
+ for (const child of current.children) {
152
+ if (visit(child, current)) {
153
+ return true;
154
+ }
155
+ }
156
+ }
157
+ return false;
158
+ }
159
+ visit(root, undefined);
160
+ return result;
161
+ }
162
+
163
+ /**
164
+ * Convert text to URL-safe slug
165
+ *
166
+ * @param text - Text to slugify
167
+ * @returns URL-safe slug
168
+ */
169
+ function slugify(text) {
170
+ return (text
171
+ // Convert to lowercase
172
+ .toLowerCase()
173
+ // Replace Chinese characters with pinyin-like representation (keep as-is for simplicity)
174
+ // Replace spaces and special chars with hyphens
175
+ .replace(/[\s_]+/g, '-')
176
+ // Remove characters that aren't alphanumeric, hyphens, or common CJK
177
+ .replace(/[^\w\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff-]/g, '')
178
+ // Replace multiple consecutive hyphens with single hyphen
179
+ .replace(/-+/g, '-')
180
+ // Remove leading/trailing hyphens
181
+ .replace(/^-+|-+$/g, ''));
182
+ }
183
+ /**
184
+ * Generate unique slug with counter suffix for duplicates
185
+ *
186
+ * @param text - Text to slugify
187
+ * @param existingSlugs - Set of existing slugs to check against
188
+ * @returns Unique slug
189
+ */
190
+ function uniqueSlugify(text, existingSlugs) {
191
+ const baseSlug = slugify(text);
192
+ let slug = baseSlug;
193
+ let counter = 1;
194
+ while (existingSlugs.has(slug)) {
195
+ slug = `${baseSlug}-${counter}`;
196
+ counter++;
197
+ }
198
+ existingSlugs.add(slug);
199
+ return slug;
200
+ }
201
+
202
+ /**
203
+ * HTML entities that need escaping
204
+ */
205
+ const HTML_ESCAPE_MAP = {
206
+ '&': '&amp;',
207
+ '<': '&lt;',
208
+ '>': '&gt;',
209
+ '"': '&quot;',
210
+ "'": '&#39;',
211
+ };
212
+ /**
213
+ * Escape HTML special characters
214
+ *
215
+ * @param text - Text to escape
216
+ * @returns Escaped text safe for HTML insertion
217
+ */
218
+ function escapeHtml(text) {
219
+ return text.replace(/[&<>"']/g, (char) => HTML_ESCAPE_MAP[char] || char);
220
+ }
221
+ /**
222
+ * Allowed HTML tags for sanitization
223
+ */
224
+ const ALLOWED_TAGS = new Set([
225
+ 'a',
226
+ 'abbr',
227
+ 'b',
228
+ 'blockquote',
229
+ 'br',
230
+ 'code',
231
+ 'dd',
232
+ 'del',
233
+ 'div',
234
+ 'dl',
235
+ 'dt',
236
+ 'em',
237
+ 'h1',
238
+ 'h2',
239
+ 'h3',
240
+ 'h4',
241
+ 'h5',
242
+ 'h6',
243
+ 'hr',
244
+ 'i',
245
+ 'img',
246
+ 'ins',
247
+ 'kbd',
248
+ 'li',
249
+ 'ol',
250
+ 'p',
251
+ 'pre',
252
+ 'q',
253
+ 's',
254
+ 'samp',
255
+ 'small',
256
+ 'span',
257
+ 'strong',
258
+ 'sub',
259
+ 'sup',
260
+ 'table',
261
+ 'tbody',
262
+ 'td',
263
+ 'tfoot',
264
+ 'th',
265
+ 'thead',
266
+ 'tr',
267
+ 'u',
268
+ 'ul',
269
+ ]);
270
+ /**
271
+ * Allowed attributes for sanitization
272
+ */
273
+ const ALLOWED_ATTRS = new Set([
274
+ 'href',
275
+ 'src',
276
+ 'alt',
277
+ 'title',
278
+ 'class',
279
+ 'id',
280
+ 'name',
281
+ 'target',
282
+ 'rel',
283
+ 'width',
284
+ 'height',
285
+ 'align',
286
+ 'colspan',
287
+ 'rowspan',
288
+ ]);
289
+ /**
290
+ * Sanitize HTML string by removing dangerous content
291
+ *
292
+ * @param html - HTML string to sanitize
293
+ * @returns Sanitized HTML string
294
+ */
295
+ function sanitizeHtml(html) {
296
+ let result = html;
297
+ // Remove script tags first
298
+ result = result.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
299
+ // Remove event handlers
300
+ result = result.replace(/\s+on\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]*)/gi, '');
301
+ // Remove disallowed tags (keep content) and sanitize attributes
302
+ result = result.replace(/<\/?(\w+)([^>]*)>/g, (match, tagName, attrs) => {
303
+ const tag = tagName.toLowerCase();
304
+ if (!ALLOWED_TAGS.has(tag)) {
305
+ return '';
306
+ }
307
+ // For closing tags, just return them
308
+ if (match.startsWith('</')) {
309
+ return `</${tag}>`;
310
+ }
311
+ // Sanitize attributes
312
+ const sanitizedAttrs = [];
313
+ const attrRegex = /\s+([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S+))/g;
314
+ let attrMatch;
315
+ while ((attrMatch = attrRegex.exec(attrs)) !== null) {
316
+ const [, attrName, v1, v2, v3] = attrMatch;
317
+ const attr = attrName.toLowerCase();
318
+ if (ALLOWED_ATTRS.has(attr)) {
319
+ let value = v1 ?? v2 ?? v3 ?? '';
320
+ // Check for dangerous URLs in href/src
321
+ if ((attr === 'href' || attr === 'src') && /^\s*javascript\s*:/i.test(value)) {
322
+ value = '';
323
+ }
324
+ sanitizedAttrs.push(`${attr}="${value}"`);
325
+ }
326
+ }
327
+ const attrStr = sanitizedAttrs.length > 0 ? ' ' + sanitizedAttrs.join(' ') : '';
328
+ return `<${tag}${attrStr}>`;
329
+ });
330
+ return result;
331
+ }
332
+ /**
333
+ * Strip all HTML tags from a string
334
+ *
335
+ * @param html - HTML string to strip
336
+ * @returns Plain text without HTML tags
337
+ */
338
+ function stripHtml(html) {
339
+ return html.replace(/<[^>]*>/g, '');
340
+ }
341
+
342
+ export { escapeHtml, findNode, findNodes, findNodesBy, findParent, isLiteral, isNodeType, isParent, sanitizeHtml, slugify, stripHtml, traverseAst, traverseAstWithCallbacks, uniqueSlugify };
343
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/types/index.ts","../src/ast/traverse.ts","../src/ast/query.ts","../src/string/slugify.ts","../src/string/sanitize.ts"],"sourcesContent":[null,null,null,null,null],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Escape HTML special characters
3
+ *
4
+ * @param text - Text to escape
5
+ * @returns Escaped text safe for HTML insertion
6
+ */
7
+ export declare function escapeHtml(text: string): string;
8
+ /**
9
+ * Sanitize HTML string by removing dangerous content
10
+ *
11
+ * @param html - HTML string to sanitize
12
+ * @returns Sanitized HTML string
13
+ */
14
+ export declare function sanitizeHtml(html: string): string;
15
+ /**
16
+ * Strip all HTML tags from a string
17
+ *
18
+ * @param html - HTML string to strip
19
+ * @returns Plain text without HTML tags
20
+ */
21
+ export declare function stripHtml(html: string): string;
22
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/string/sanitize.ts"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAwED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+CjD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Convert text to URL-safe slug
3
+ *
4
+ * @param text - Text to slugify
5
+ * @returns URL-safe slug
6
+ */
7
+ export declare function slugify(text: string): string;
8
+ /**
9
+ * Generate unique slug with counter suffix for duplicates
10
+ *
11
+ * @param text - Text to slugify
12
+ * @param existingSlugs - Set of existing slugs to check against
13
+ * @returns Unique slug
14
+ */
15
+ export declare function uniqueSlugify(text: string, existingSlugs: Set<string>): string;
16
+ //# sourceMappingURL=slugify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slugify.d.ts","sourceRoot":"","sources":["../../src/string/slugify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe5C;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAY9E"}
@@ -0,0 +1,49 @@
1
+ import type { Root, Content, Parent, Literal } from 'mdast';
2
+ import type { Node as UnistNode } from 'unist';
3
+ export type { Root, Content, Parent, Literal };
4
+ /**
5
+ * All possible markdown node types
6
+ */
7
+ export type MdNode = Root | Content;
8
+ /**
9
+ * Root node of markdown AST
10
+ */
11
+ export type MdRoot = Root;
12
+ /**
13
+ * Visitor function for AST traversal
14
+ */
15
+ export type Visitor<T extends UnistNode = MdNode> = (node: T, index: number | undefined, parent: Parent | undefined) => void | boolean;
16
+ /**
17
+ * Plugin options base interface
18
+ */
19
+ export interface PluginOptions {
20
+ [key: string]: unknown;
21
+ }
22
+ /**
23
+ * Position information in source
24
+ */
25
+ export interface Position {
26
+ line: number;
27
+ column: number;
28
+ offset?: number;
29
+ }
30
+ /**
31
+ * Location in source
32
+ */
33
+ export interface Location {
34
+ start: Position;
35
+ end: Position;
36
+ }
37
+ /**
38
+ * Type guard to check if node is a parent node
39
+ */
40
+ export declare function isParent(node: UnistNode): node is Parent;
41
+ /**
42
+ * Type guard to check if node is a literal node
43
+ */
44
+ export declare function isLiteral(node: UnistNode): node is Literal;
45
+ /**
46
+ * Type guard to check if node has specific type
47
+ */
48
+ export declare function isNodeType<T extends MdNode>(node: UnistNode, type: T['type']): node is T;
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC3D,OAAO,KAAK,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,OAAO,CAAA;AAG9C,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAE9C;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAA;AAEnC;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,IAAI,CAAA;AAEzB;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,MAAM,IAAI,CAClD,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,KACvB,IAAI,GAAG,OAAO,CAAA;AAEnB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAA;IACf,GAAG,EAAE,QAAQ,CAAA;CACd;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GACd,IAAI,IAAI,CAAC,CAEX"}
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@pd-markdown/utils",
3
+ "version": "0.1.0",
4
+ "description": "Utility functions and types for pd-markdown",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./dist/index.mjs",
9
+ "require": "./dist/index.cjs",
10
+ "types": "./dist/index.d.ts"
11
+ }
12
+ },
13
+ "main": "./dist/index.cjs",
14
+ "module": "./dist/index.mjs",
15
+ "types": "./dist/index.d.ts",
16
+ "files": ["dist"],
17
+ "scripts": {
18
+ "build": "rollup -c rollup.config.ts --configPlugin typescript",
19
+ "clean": "rm -rf dist *.tsbuildinfo"
20
+ },
21
+ "devDependencies": {
22
+ "@types/mdast": "^4.0.4",
23
+ "@types/unist": "^3.0.3"
24
+ },
25
+ "sideEffects": false,
26
+ "license": "MIT"
27
+ }
@@ -0,0 +1,26 @@
1
+ import typescript from '@rollup/plugin-typescript'
2
+ import { defineConfig } from 'rollup'
3
+
4
+ export default defineConfig({
5
+ input: 'src/index.ts',
6
+ output: [
7
+ {
8
+ file: 'dist/index.mjs',
9
+ format: 'esm',
10
+ sourcemap: true,
11
+ },
12
+ {
13
+ file: 'dist/index.cjs',
14
+ format: 'cjs',
15
+ sourcemap: true,
16
+ },
17
+ ],
18
+ plugins: [
19
+ typescript({
20
+ tsconfig: './tsconfig.json',
21
+ declaration: true,
22
+ declarationDir: './dist',
23
+ }),
24
+ ],
25
+ external: [],
26
+ })
@@ -0,0 +1,127 @@
1
+ import type { Node } from 'unist'
2
+ import type { MdNode, Parent } from '../types'
3
+ import { isParent } from '../types'
4
+
5
+ /**
6
+ * Find all nodes of a specific type in the AST
7
+ *
8
+ * @param node - Root node to search from
9
+ * @param type - Node type to find
10
+ * @returns Array of matching nodes
11
+ */
12
+ export function findNodes<T extends Node = MdNode>(
13
+ node: Node,
14
+ type: string
15
+ ): T[] {
16
+ const results: T[] = []
17
+
18
+ function visit(current: Node): void {
19
+ if (current.type === type) {
20
+ results.push(current as T)
21
+ }
22
+
23
+ if (isParent(current)) {
24
+ for (const child of current.children) {
25
+ visit(child)
26
+ }
27
+ }
28
+ }
29
+
30
+ visit(node)
31
+ return results
32
+ }
33
+
34
+ /**
35
+ * Find the first node of a specific type in the AST
36
+ *
37
+ * @param node - Root node to search from
38
+ * @param type - Node type to find
39
+ * @returns The first matching node or undefined
40
+ */
41
+ export function findNode<T extends Node = MdNode>(
42
+ node: Node,
43
+ type: string
44
+ ): T | undefined {
45
+ let result: T | undefined
46
+
47
+ function visit(current: Node): boolean {
48
+ if (current.type === type) {
49
+ result = current as T
50
+ return true // Found, stop searching
51
+ }
52
+
53
+ if (isParent(current)) {
54
+ for (const child of current.children) {
55
+ if (visit(child)) {
56
+ return true
57
+ }
58
+ }
59
+ }
60
+
61
+ return false
62
+ }
63
+
64
+ visit(node)
65
+ return result
66
+ }
67
+
68
+ /**
69
+ * Find all nodes matching a predicate
70
+ *
71
+ * @param node - Root node to search from
72
+ * @param predicate - Function to test each node
73
+ * @returns Array of matching nodes
74
+ */
75
+ export function findNodesBy<T extends Node = MdNode>(
76
+ node: Node,
77
+ predicate: (node: Node) => boolean
78
+ ): T[] {
79
+ const results: T[] = []
80
+
81
+ function visit(current: Node): void {
82
+ if (predicate(current)) {
83
+ results.push(current as T)
84
+ }
85
+
86
+ if (isParent(current)) {
87
+ for (const child of current.children) {
88
+ visit(child)
89
+ }
90
+ }
91
+ }
92
+
93
+ visit(node)
94
+ return results
95
+ }
96
+
97
+ /**
98
+ * Get the parent of a node in the AST
99
+ * Note: This requires traversing from root, use sparingly
100
+ *
101
+ * @param root - Root node of the AST
102
+ * @param target - Node to find parent of
103
+ * @returns Parent node or undefined if not found or is root
104
+ */
105
+ export function findParent(root: Node, target: Node): Parent | undefined {
106
+ let result: Parent | undefined
107
+
108
+ function visit(current: Node, parent: Parent | undefined): boolean {
109
+ if (current === target) {
110
+ result = parent
111
+ return true
112
+ }
113
+
114
+ if (isParent(current)) {
115
+ for (const child of current.children) {
116
+ if (visit(child, current)) {
117
+ return true
118
+ }
119
+ }
120
+ }
121
+
122
+ return false
123
+ }
124
+
125
+ visit(root, undefined)
126
+ return result
127
+ }