@knpkv/confluence-to-markdown 0.2.0 → 0.4.1

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 (336) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/LICENSE +21 -0
  3. package/README.md +282 -14
  4. package/dist/ConfluenceAuth.d.ts +76 -0
  5. package/dist/ConfluenceAuth.d.ts.map +1 -0
  6. package/dist/ConfluenceAuth.js +356 -0
  7. package/dist/ConfluenceAuth.js.map +1 -0
  8. package/dist/ConfluenceClient.d.ts +26 -2
  9. package/dist/ConfluenceClient.d.ts.map +1 -1
  10. package/dist/ConfluenceClient.js +98 -92
  11. package/dist/ConfluenceClient.js.map +1 -1
  12. package/dist/ConfluenceConfig.d.ts +4 -24
  13. package/dist/ConfluenceConfig.d.ts.map +1 -1
  14. package/dist/ConfluenceConfig.js +45 -7
  15. package/dist/ConfluenceConfig.js.map +1 -1
  16. package/dist/ConfluenceError.d.ts +89 -6
  17. package/dist/ConfluenceError.d.ts.map +1 -1
  18. package/dist/ConfluenceError.js +88 -5
  19. package/dist/ConfluenceError.js.map +1 -1
  20. package/dist/GitError.d.ts +103 -0
  21. package/dist/GitError.d.ts.map +1 -0
  22. package/dist/GitError.js +85 -0
  23. package/dist/GitError.js.map +1 -0
  24. package/dist/GitService.d.ts +175 -0
  25. package/dist/GitService.d.ts.map +1 -0
  26. package/dist/GitService.js +431 -0
  27. package/dist/GitService.js.map +1 -0
  28. package/dist/LocalFileSystem.d.ts +29 -4
  29. package/dist/LocalFileSystem.d.ts.map +1 -1
  30. package/dist/LocalFileSystem.js +80 -6
  31. package/dist/LocalFileSystem.js.map +1 -1
  32. package/dist/MarkdownConverter.d.ts +49 -2
  33. package/dist/MarkdownConverter.d.ts.map +1 -1
  34. package/dist/MarkdownConverter.js +73 -111
  35. package/dist/MarkdownConverter.js.map +1 -1
  36. package/dist/SchemaConverterError.d.ts +108 -0
  37. package/dist/SchemaConverterError.d.ts.map +1 -0
  38. package/dist/SchemaConverterError.js +84 -0
  39. package/dist/SchemaConverterError.js.map +1 -0
  40. package/dist/Schemas.d.ts +225 -1
  41. package/dist/Schemas.d.ts.map +1 -1
  42. package/dist/Schemas.js +155 -6
  43. package/dist/Schemas.js.map +1 -1
  44. package/dist/SyncEngine.d.ts +30 -20
  45. package/dist/SyncEngine.d.ts.map +1 -1
  46. package/dist/SyncEngine.js +566 -117
  47. package/dist/SyncEngine.js.map +1 -1
  48. package/dist/ast/BlockNode.d.ts +468 -0
  49. package/dist/ast/BlockNode.d.ts.map +1 -0
  50. package/dist/ast/BlockNode.js +319 -0
  51. package/dist/ast/BlockNode.js.map +1 -0
  52. package/dist/ast/Document.d.ts +244 -0
  53. package/dist/ast/Document.d.ts.map +1 -0
  54. package/dist/ast/Document.js +69 -0
  55. package/dist/ast/Document.js.map +1 -0
  56. package/dist/ast/InlineNode.d.ts +477 -0
  57. package/dist/ast/InlineNode.d.ts.map +1 -0
  58. package/dist/ast/InlineNode.js +263 -0
  59. package/dist/ast/InlineNode.js.map +1 -0
  60. package/dist/ast/MacroNode.d.ts +267 -0
  61. package/dist/ast/MacroNode.d.ts.map +1 -0
  62. package/dist/ast/MacroNode.js +164 -0
  63. package/dist/ast/MacroNode.js.map +1 -0
  64. package/dist/ast/index.d.ts +10 -0
  65. package/dist/ast/index.d.ts.map +1 -0
  66. package/dist/ast/index.js +14 -0
  67. package/dist/ast/index.js.map +1 -0
  68. package/dist/bin.js +33 -149
  69. package/dist/bin.js.map +1 -1
  70. package/dist/commands/auth.d.ts +15 -0
  71. package/dist/commands/auth.d.ts.map +1 -0
  72. package/dist/commands/auth.js +86 -0
  73. package/dist/commands/auth.js.map +1 -0
  74. package/dist/commands/clone.d.ts +12 -0
  75. package/dist/commands/clone.d.ts.map +1 -0
  76. package/dist/commands/clone.js +93 -0
  77. package/dist/commands/clone.js.map +1 -0
  78. package/dist/commands/delete.d.ts +13 -0
  79. package/dist/commands/delete.d.ts.map +1 -0
  80. package/dist/commands/delete.js +48 -0
  81. package/dist/commands/delete.js.map +1 -0
  82. package/dist/commands/errorHandler.d.ts +14 -0
  83. package/dist/commands/errorHandler.d.ts.map +1 -0
  84. package/dist/commands/errorHandler.js +33 -0
  85. package/dist/commands/errorHandler.js.map +1 -0
  86. package/dist/commands/git.d.ts +22 -0
  87. package/dist/commands/git.d.ts.map +1 -0
  88. package/dist/commands/git.js +72 -0
  89. package/dist/commands/git.js.map +1 -0
  90. package/dist/commands/index.d.ts +11 -0
  91. package/dist/commands/index.d.ts.map +1 -0
  92. package/dist/commands/index.js +11 -0
  93. package/dist/commands/index.js.map +1 -0
  94. package/dist/commands/layers.d.ts +31 -0
  95. package/dist/commands/layers.d.ts.map +1 -0
  96. package/dist/commands/layers.js +137 -0
  97. package/dist/commands/layers.js.map +1 -0
  98. package/dist/commands/new.d.ts +9 -0
  99. package/dist/commands/new.d.ts.map +1 -0
  100. package/dist/commands/new.js +80 -0
  101. package/dist/commands/new.js.map +1 -0
  102. package/dist/commands/pageTree.d.ts +18 -0
  103. package/dist/commands/pageTree.d.ts.map +1 -0
  104. package/dist/commands/pageTree.js +20 -0
  105. package/dist/commands/pageTree.js.map +1 -0
  106. package/dist/commands/shared.d.ts +15 -0
  107. package/dist/commands/shared.d.ts.map +1 -0
  108. package/dist/commands/shared.js +27 -0
  109. package/dist/commands/shared.js.map +1 -0
  110. package/dist/commands/sync.d.ts +15 -0
  111. package/dist/commands/sync.d.ts.map +1 -0
  112. package/dist/commands/sync.js +101 -0
  113. package/dist/commands/sync.js.map +1 -0
  114. package/dist/index.d.ts +10 -1
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +14 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/internal/NodeLayers.d.ts +7 -0
  119. package/dist/internal/NodeLayers.d.ts.map +1 -0
  120. package/dist/internal/NodeLayers.js +19 -0
  121. package/dist/internal/NodeLayers.js.map +1 -0
  122. package/dist/internal/frontmatter.d.ts +10 -0
  123. package/dist/internal/frontmatter.d.ts.map +1 -1
  124. package/dist/internal/frontmatter.js +16 -0
  125. package/dist/internal/frontmatter.js.map +1 -1
  126. package/dist/internal/gitCommands.d.ts +78 -0
  127. package/dist/internal/gitCommands.d.ts.map +1 -0
  128. package/dist/internal/gitCommands.js +156 -0
  129. package/dist/internal/gitCommands.js.map +1 -0
  130. package/dist/internal/hashUtils.d.ts +42 -1
  131. package/dist/internal/hashUtils.d.ts.map +1 -1
  132. package/dist/internal/hashUtils.js +38 -2
  133. package/dist/internal/hashUtils.js.map +1 -1
  134. package/dist/internal/oauthServer.d.ts +55 -0
  135. package/dist/internal/oauthServer.d.ts.map +1 -0
  136. package/dist/internal/oauthServer.js +110 -0
  137. package/dist/internal/oauthServer.js.map +1 -0
  138. package/dist/internal/pathUtils.d.ts +21 -4
  139. package/dist/internal/pathUtils.d.ts.map +1 -1
  140. package/dist/internal/pathUtils.js +24 -13
  141. package/dist/internal/pathUtils.js.map +1 -1
  142. package/dist/internal/tokenStorage.d.ts +75 -0
  143. package/dist/internal/tokenStorage.d.ts.map +1 -0
  144. package/dist/internal/tokenStorage.js +149 -0
  145. package/dist/internal/tokenStorage.js.map +1 -0
  146. package/dist/internal/userCache.d.ts +42 -0
  147. package/dist/internal/userCache.d.ts.map +1 -0
  148. package/dist/internal/userCache.js +51 -0
  149. package/dist/internal/userCache.js.map +1 -0
  150. package/dist/parsers/ConfluenceParser.d.ts +26 -0
  151. package/dist/parsers/ConfluenceParser.d.ts.map +1 -0
  152. package/dist/parsers/ConfluenceParser.js +792 -0
  153. package/dist/parsers/ConfluenceParser.js.map +1 -0
  154. package/dist/parsers/MarkdownParser.d.ts +26 -0
  155. package/dist/parsers/MarkdownParser.d.ts.map +1 -0
  156. package/dist/parsers/MarkdownParser.js +873 -0
  157. package/dist/parsers/MarkdownParser.js.map +1 -0
  158. package/dist/parsers/index.d.ts +8 -0
  159. package/dist/parsers/index.d.ts.map +1 -0
  160. package/dist/parsers/index.js +8 -0
  161. package/dist/parsers/index.js.map +1 -0
  162. package/dist/schemas/ConfluenceSchema.d.ts +21 -0
  163. package/dist/schemas/ConfluenceSchema.d.ts.map +1 -0
  164. package/dist/schemas/ConfluenceSchema.js +38 -0
  165. package/dist/schemas/ConfluenceSchema.js.map +1 -0
  166. package/dist/schemas/ConversionSchema.d.ts +35 -0
  167. package/dist/schemas/ConversionSchema.d.ts.map +1 -0
  168. package/dist/schemas/ConversionSchema.js +208 -0
  169. package/dist/schemas/ConversionSchema.js.map +1 -0
  170. package/dist/schemas/MarkdownSchema.d.ts +21 -0
  171. package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
  172. package/dist/schemas/MarkdownSchema.js +38 -0
  173. package/dist/schemas/MarkdownSchema.js.map +1 -0
  174. package/dist/schemas/hast/HastFromHtml.d.ts +27 -0
  175. package/dist/schemas/hast/HastFromHtml.d.ts.map +1 -0
  176. package/dist/schemas/hast/HastFromHtml.js +107 -0
  177. package/dist/schemas/hast/HastFromHtml.js.map +1 -0
  178. package/dist/schemas/hast/HastSchema.d.ts +195 -0
  179. package/dist/schemas/hast/HastSchema.d.ts.map +1 -0
  180. package/dist/schemas/hast/HastSchema.js +183 -0
  181. package/dist/schemas/hast/HastSchema.js.map +1 -0
  182. package/dist/schemas/hast/index.d.ts +9 -0
  183. package/dist/schemas/hast/index.d.ts.map +1 -0
  184. package/dist/schemas/hast/index.js +3 -0
  185. package/dist/schemas/hast/index.js.map +1 -0
  186. package/dist/schemas/index.d.ts +14 -0
  187. package/dist/schemas/index.d.ts.map +1 -0
  188. package/dist/schemas/index.js +16 -0
  189. package/dist/schemas/index.js.map +1 -0
  190. package/dist/schemas/mdast/MdastFromMarkdown.d.ts +30 -0
  191. package/dist/schemas/mdast/MdastFromMarkdown.d.ts.map +1 -0
  192. package/dist/schemas/mdast/MdastFromMarkdown.js +79 -0
  193. package/dist/schemas/mdast/MdastFromMarkdown.js.map +1 -0
  194. package/dist/schemas/mdast/MdastSchema.d.ts +385 -0
  195. package/dist/schemas/mdast/MdastSchema.d.ts.map +1 -0
  196. package/dist/schemas/mdast/MdastSchema.js +266 -0
  197. package/dist/schemas/mdast/MdastSchema.js.map +1 -0
  198. package/dist/schemas/mdast/index.d.ts +10 -0
  199. package/dist/schemas/mdast/index.d.ts.map +1 -0
  200. package/dist/schemas/mdast/index.js +4 -0
  201. package/dist/schemas/mdast/index.js.map +1 -0
  202. package/dist/schemas/mdast/mdastToString.d.ts +13 -0
  203. package/dist/schemas/mdast/mdastToString.d.ts.map +1 -0
  204. package/dist/schemas/mdast/mdastToString.js +85 -0
  205. package/dist/schemas/mdast/mdastToString.js.map +1 -0
  206. package/dist/schemas/nodes/block/BlockSchema.d.ts +43 -0
  207. package/dist/schemas/nodes/block/BlockSchema.d.ts.map +1 -0
  208. package/dist/schemas/nodes/block/BlockSchema.js +634 -0
  209. package/dist/schemas/nodes/block/BlockSchema.js.map +1 -0
  210. package/dist/schemas/nodes/block/index.d.ts +7 -0
  211. package/dist/schemas/nodes/block/index.d.ts.map +1 -0
  212. package/dist/schemas/nodes/block/index.js +7 -0
  213. package/dist/schemas/nodes/block/index.js.map +1 -0
  214. package/dist/schemas/nodes/index.d.ts +9 -0
  215. package/dist/schemas/nodes/index.d.ts.map +1 -0
  216. package/dist/schemas/nodes/index.js +12 -0
  217. package/dist/schemas/nodes/index.js.map +1 -0
  218. package/dist/schemas/nodes/inline/InlineSchema.d.ts +48 -0
  219. package/dist/schemas/nodes/inline/InlineSchema.d.ts.map +1 -0
  220. package/dist/schemas/nodes/inline/InlineSchema.js +436 -0
  221. package/dist/schemas/nodes/inline/InlineSchema.js.map +1 -0
  222. package/dist/schemas/nodes/inline/index.d.ts +7 -0
  223. package/dist/schemas/nodes/inline/index.d.ts.map +1 -0
  224. package/dist/schemas/nodes/inline/index.js +7 -0
  225. package/dist/schemas/nodes/inline/index.js.map +1 -0
  226. package/dist/schemas/nodes/macro/MacroSchema.d.ts +27 -0
  227. package/dist/schemas/nodes/macro/MacroSchema.d.ts.map +1 -0
  228. package/dist/schemas/nodes/macro/MacroSchema.js +162 -0
  229. package/dist/schemas/nodes/macro/MacroSchema.js.map +1 -0
  230. package/dist/schemas/nodes/macro/index.d.ts +7 -0
  231. package/dist/schemas/nodes/macro/index.d.ts.map +1 -0
  232. package/dist/schemas/nodes/macro/index.js +7 -0
  233. package/dist/schemas/nodes/macro/index.js.map +1 -0
  234. package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts +24 -0
  235. package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts.map +1 -0
  236. package/dist/schemas/preprocessing/ConfluencePreprocessor.js +351 -0
  237. package/dist/schemas/preprocessing/ConfluencePreprocessor.js.map +1 -0
  238. package/dist/schemas/preprocessing/index.d.ts +8 -0
  239. package/dist/schemas/preprocessing/index.d.ts.map +1 -0
  240. package/dist/schemas/preprocessing/index.js +2 -0
  241. package/dist/schemas/preprocessing/index.js.map +1 -0
  242. package/dist/serializers/ConfluenceSerializer.d.ts +30 -0
  243. package/dist/serializers/ConfluenceSerializer.d.ts.map +1 -0
  244. package/dist/serializers/ConfluenceSerializer.js +551 -0
  245. package/dist/serializers/ConfluenceSerializer.js.map +1 -0
  246. package/dist/serializers/MarkdownSerializer.d.ts +34 -0
  247. package/dist/serializers/MarkdownSerializer.d.ts.map +1 -0
  248. package/dist/serializers/MarkdownSerializer.js +355 -0
  249. package/dist/serializers/MarkdownSerializer.js.map +1 -0
  250. package/dist/serializers/index.d.ts +8 -0
  251. package/dist/serializers/index.d.ts.map +1 -0
  252. package/dist/serializers/index.js +8 -0
  253. package/dist/serializers/index.js.map +1 -0
  254. package/package.json +27 -16
  255. package/src/ConfluenceAuth.ts +571 -0
  256. package/src/ConfluenceClient.ts +188 -156
  257. package/src/ConfluenceConfig.ts +63 -7
  258. package/src/ConfluenceError.ts +110 -14
  259. package/src/GitError.ts +92 -0
  260. package/src/GitService.ts +859 -0
  261. package/src/LocalFileSystem.ts +179 -9
  262. package/src/MarkdownConverter.ts +126 -122
  263. package/src/SchemaConverterError.ts +108 -0
  264. package/src/Schemas.ts +223 -6
  265. package/src/SyncEngine.ts +745 -162
  266. package/src/ast/BlockNode.ts +425 -0
  267. package/src/ast/Document.ts +90 -0
  268. package/src/ast/InlineNode.ts +323 -0
  269. package/src/ast/MacroNode.ts +245 -0
  270. package/src/ast/index.ts +83 -0
  271. package/src/bin.ts +50 -249
  272. package/src/commands/auth.ts +117 -0
  273. package/src/commands/clone.ts +145 -0
  274. package/src/commands/delete.ts +57 -0
  275. package/src/commands/errorHandler.ts +32 -0
  276. package/src/commands/git.ts +114 -0
  277. package/src/commands/index.ts +10 -0
  278. package/src/commands/layers.ts +211 -0
  279. package/src/commands/new.ts +99 -0
  280. package/src/commands/pageTree.ts +40 -0
  281. package/src/commands/shared.ts +35 -0
  282. package/src/commands/sync.ts +129 -0
  283. package/src/index.ts +21 -1
  284. package/src/internal/NodeLayers.ts +21 -0
  285. package/src/internal/frontmatter.ts +21 -0
  286. package/src/internal/gitCommands.ts +229 -0
  287. package/src/internal/hashUtils.ts +65 -3
  288. package/src/internal/oauthServer.ts +199 -0
  289. package/src/internal/pathUtils.ts +34 -17
  290. package/src/internal/tokenStorage.ts +240 -0
  291. package/src/internal/userCache.ts +90 -0
  292. package/src/parsers/ConfluenceParser.ts +950 -0
  293. package/src/parsers/MarkdownParser.ts +1198 -0
  294. package/src/parsers/index.ts +8 -0
  295. package/src/schemas/ConfluenceSchema.ts +56 -0
  296. package/src/schemas/ConversionSchema.ts +318 -0
  297. package/src/schemas/MarkdownSchema.ts +56 -0
  298. package/src/schemas/hast/HastFromHtml.ts +153 -0
  299. package/src/schemas/hast/HastSchema.ts +274 -0
  300. package/src/schemas/hast/index.ts +35 -0
  301. package/src/schemas/index.ts +20 -0
  302. package/src/schemas/mdast/MdastFromMarkdown.ts +118 -0
  303. package/src/schemas/mdast/MdastSchema.ts +566 -0
  304. package/src/schemas/mdast/index.ts +59 -0
  305. package/src/schemas/mdast/mdastToString.ts +102 -0
  306. package/src/schemas/nodes/block/BlockSchema.ts +773 -0
  307. package/src/schemas/nodes/block/index.ts +13 -0
  308. package/src/schemas/nodes/index.ts +20 -0
  309. package/src/schemas/nodes/inline/InlineSchema.ts +523 -0
  310. package/src/schemas/nodes/inline/index.ts +14 -0
  311. package/src/schemas/nodes/macro/MacroSchema.ts +226 -0
  312. package/src/schemas/nodes/macro/index.ts +6 -0
  313. package/src/schemas/preprocessing/ConfluencePreprocessor.ts +446 -0
  314. package/src/schemas/preprocessing/index.ts +8 -0
  315. package/src/serializers/ConfluenceSerializer.ts +717 -0
  316. package/src/serializers/MarkdownSerializer.ts +493 -0
  317. package/src/serializers/index.ts +8 -0
  318. package/test/GitService.test.ts +209 -0
  319. package/test/MarkdownConverter.test.ts +37 -3
  320. package/test/Schemas.test.ts +97 -2
  321. package/test/ast/BlockNode.test.ts +265 -0
  322. package/test/ast/Document.test.ts +126 -0
  323. package/test/ast/InlineNode.test.ts +161 -0
  324. package/test/fixtures/integration-test.html.fixture +103 -0
  325. package/test/fixtures/integration-test.md.expected +257 -0
  326. package/test/integration.test.ts +269 -0
  327. package/test/oauthServer.test.ts +50 -0
  328. package/test/parsers/ConfluenceParser.test.ts +283 -0
  329. package/test/schemas/ConfluencePreprocessor.test.ts +180 -0
  330. package/test/schemas/ConversionSchema.test.ts +159 -0
  331. package/test/schemas/HastSchema.test.ts +138 -0
  332. package/test/schemas/MdastSchema.test.ts +145 -0
  333. package/test/schemas/nodes/block/BlockSchema.test.ts +173 -0
  334. package/test/schemas/nodes/inline/InlineSchema.test.ts +198 -0
  335. package/test/schemas/nodes/macro/MacroSchema.test.ts +142 -0
  336. package/test/tokenStorage.test.ts +99 -0
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Effect Schema definitions for HAST (Hypertext Abstract Syntax Tree) nodes.
3
+ *
4
+ * HAST is the intermediate representation used when parsing HTML.
5
+ * These schemas provide type-safe transformation between raw HTML and our AST.
6
+ *
7
+ * @module
8
+ */
9
+ import * as Schema from "effect/Schema"
10
+
11
+ /**
12
+ * HAST element properties type.
13
+ *
14
+ * @category Types
15
+ */
16
+ export type HastProperties = Record<string, unknown>
17
+
18
+ /**
19
+ * HAST text node type.
20
+ *
21
+ * @category Types
22
+ */
23
+ export interface HastText {
24
+ readonly _tag: "text"
25
+ readonly value: string
26
+ }
27
+
28
+ /**
29
+ * HAST comment node type.
30
+ *
31
+ * @category Types
32
+ */
33
+ export interface HastComment {
34
+ readonly _tag: "comment"
35
+ readonly value: string
36
+ }
37
+
38
+ /**
39
+ * HAST doctype node type.
40
+ *
41
+ * @category Types
42
+ */
43
+ export interface HastDoctype {
44
+ readonly _tag: "doctype"
45
+ }
46
+
47
+ /**
48
+ * HAST element node type.
49
+ *
50
+ * @category Types
51
+ */
52
+ export interface HastElement {
53
+ readonly _tag: "element"
54
+ readonly tagName: string
55
+ readonly properties: HastProperties
56
+ readonly children: ReadonlyArray<HastNode>
57
+ }
58
+
59
+ /**
60
+ * Union of all HAST node types.
61
+ *
62
+ * @category Types
63
+ */
64
+ export type HastNode = HastText | HastElement | HastComment | HastDoctype
65
+
66
+ /**
67
+ * HAST root node type.
68
+ *
69
+ * @category Types
70
+ */
71
+ export interface HastRoot {
72
+ readonly _tag: "root"
73
+ readonly children: ReadonlyArray<HastNode>
74
+ }
75
+
76
+ /**
77
+ * Create a HAST text node.
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * import { makeHastText } from "@knpkv/confluence-to-markdown/schemas/hast"
82
+ *
83
+ * const text = makeHastText("Hello world")
84
+ * console.log(text.value) // "Hello world"
85
+ * ```
86
+ *
87
+ * @category Constructors
88
+ */
89
+ export const makeHastText = (value: string): HastText => ({
90
+ _tag: "text",
91
+ value
92
+ })
93
+
94
+ /**
95
+ * Create a HAST comment node.
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * import { makeHastComment } from "@knpkv/confluence-to-markdown/schemas/hast"
100
+ *
101
+ * const comment = makeHastComment("cf:layout-start")
102
+ * ```
103
+ *
104
+ * @category Constructors
105
+ */
106
+ export const makeHastComment = (value: string): HastComment => ({
107
+ _tag: "comment",
108
+ value
109
+ })
110
+
111
+ /**
112
+ * Create a HAST doctype node.
113
+ *
114
+ * @category Constructors
115
+ */
116
+ export const makeHastDoctype = (): HastDoctype => ({
117
+ _tag: "doctype"
118
+ })
119
+
120
+ /**
121
+ * Create a HAST element node.
122
+ *
123
+ * @example
124
+ * ```typescript
125
+ * import { makeHastElement, makeHastText } from "@knpkv/confluence-to-markdown/schemas/hast"
126
+ *
127
+ * const heading = makeHastElement("h1", { id: "title" }, [makeHastText("Hello")])
128
+ * ```
129
+ *
130
+ * @category Constructors
131
+ */
132
+ export const makeHastElement = (
133
+ tagName: string,
134
+ properties: HastProperties = {},
135
+ children: ReadonlyArray<HastNode> = []
136
+ ): HastElement => ({
137
+ _tag: "element",
138
+ tagName,
139
+ properties,
140
+ children
141
+ })
142
+
143
+ /**
144
+ * Create a HAST root node.
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * import { makeHastRoot, makeHastElement, makeHastText } from "@knpkv/confluence-to-markdown/schemas/hast"
149
+ *
150
+ * const root = makeHastRoot([
151
+ * makeHastElement("p", {}, [makeHastText("Content")])
152
+ * ])
153
+ * ```
154
+ *
155
+ * @category Constructors
156
+ */
157
+ export const makeHastRoot = (children: ReadonlyArray<HastNode>): HastRoot => ({
158
+ _tag: "root",
159
+ children
160
+ })
161
+
162
+ /**
163
+ * Type guard to check if a HastNode is a HastElement.
164
+ *
165
+ * @category Guards
166
+ */
167
+ export const isHastElement = (node: HastNode): node is HastElement => node._tag === "element"
168
+
169
+ /**
170
+ * Type guard to check if a HastNode is a HastText.
171
+ *
172
+ * @category Guards
173
+ */
174
+ export const isHastText = (node: HastNode): node is HastText => node._tag === "text"
175
+
176
+ /**
177
+ * Type guard to check if a HastNode is a HastComment.
178
+ *
179
+ * @category Guards
180
+ */
181
+ export const isHastComment = (node: HastNode): node is HastComment => node._tag === "comment"
182
+
183
+ /**
184
+ * Get text content from a HastNode recursively.
185
+ *
186
+ * @category Utilities
187
+ */
188
+ export const getTextContent = (node: HastNode): string => {
189
+ if (isHastText(node)) {
190
+ return node.value
191
+ }
192
+ if (isHastElement(node)) {
193
+ return node.children.map(getTextContent).join("")
194
+ }
195
+ return ""
196
+ }
197
+
198
+ // Schema definitions for validation
199
+
200
+ /**
201
+ * Schema for HAST text node.
202
+ *
203
+ * @category Schemas
204
+ */
205
+ export const HastTextSchema: Schema.Schema<HastText> = Schema.Struct({
206
+ _tag: Schema.Literal("text"),
207
+ value: Schema.String
208
+ })
209
+
210
+ /**
211
+ * Schema for HAST comment node.
212
+ *
213
+ * @category Schemas
214
+ */
215
+ export const HastCommentSchema: Schema.Schema<HastComment> = Schema.Struct({
216
+ _tag: Schema.Literal("comment"),
217
+ value: Schema.String
218
+ })
219
+
220
+ /**
221
+ * Schema for HAST doctype node.
222
+ *
223
+ * @category Schemas
224
+ */
225
+ export const HastDoctypeSchema: Schema.Schema<HastDoctype> = Schema.Struct({
226
+ _tag: Schema.Literal("doctype")
227
+ })
228
+
229
+ /**
230
+ * Schema for HAST properties.
231
+ *
232
+ * @category Schemas
233
+ */
234
+ export const HastPropertiesSchema = Schema.Record({
235
+ key: Schema.String,
236
+ value: Schema.Unknown
237
+ })
238
+
239
+ // Forward reference for recursive schema
240
+ const HastNodeSchemaLazy: Schema.Schema<HastNode> = Schema.suspend(() => HastNodeSchema)
241
+
242
+ /**
243
+ * Schema for HAST element node.
244
+ *
245
+ * @category Schemas
246
+ */
247
+ export const HastElementSchema: Schema.Schema<HastElement> = Schema.Struct({
248
+ _tag: Schema.Literal("element"),
249
+ tagName: Schema.String,
250
+ properties: HastPropertiesSchema,
251
+ children: Schema.Array(HastNodeSchemaLazy)
252
+ })
253
+
254
+ /**
255
+ * Schema for HAST node union.
256
+ *
257
+ * @category Schemas
258
+ */
259
+ export const HastNodeSchema: Schema.Schema<HastNode> = Schema.Union(
260
+ HastTextSchema,
261
+ HastElementSchema,
262
+ HastCommentSchema,
263
+ HastDoctypeSchema
264
+ )
265
+
266
+ /**
267
+ * Schema for HAST root.
268
+ *
269
+ * @category Schemas
270
+ */
271
+ export const HastRootSchema: Schema.Schema<HastRoot> = Schema.Struct({
272
+ _tag: Schema.Literal("root"),
273
+ children: Schema.Array(HastNodeSchema)
274
+ })
@@ -0,0 +1,35 @@
1
+ /**
2
+ * HAST (Hypertext Abstract Syntax Tree) schemas.
3
+ *
4
+ * @module
5
+ */
6
+ export type {
7
+ HastComment,
8
+ HastDoctype,
9
+ HastElement,
10
+ HastNode,
11
+ HastProperties,
12
+ HastRoot,
13
+ HastText
14
+ } from "./HastSchema.js"
15
+
16
+ export {
17
+ getTextContent,
18
+ HastCommentSchema,
19
+ HastDoctypeSchema,
20
+ HastElementSchema,
21
+ HastNodeSchema,
22
+ HastPropertiesSchema,
23
+ HastRootSchema,
24
+ HastTextSchema,
25
+ isHastComment,
26
+ isHastElement,
27
+ isHastText,
28
+ makeHastComment,
29
+ makeHastDoctype,
30
+ makeHastElement,
31
+ makeHastRoot,
32
+ makeHastText
33
+ } from "./HastSchema.js"
34
+
35
+ export { HastFromHtml } from "./HastFromHtml.js"
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Bi-directional schemas for AST transformations.
3
+ *
4
+ * @module
5
+ */
6
+
7
+ export { DocumentFromConfluence } from "./ConfluenceSchema.js"
8
+ export { ConfluenceToMarkdown, DocumentFromHast, DocumentFromMdast } from "./ConversionSchema.js"
9
+ export { DocumentFromMarkdown } from "./MarkdownSchema.js"
10
+
11
+ // Re-export node schemas
12
+ export * from "./nodes/index.js"
13
+
14
+ // Re-export preprocessing
15
+ export { PreprocessedHtmlFromConfluence } from "./preprocessing/index.js"
16
+ export type { PreprocessedHtml } from "./preprocessing/index.js"
17
+
18
+ // Re-export HAST/MDAST types and schemas
19
+ export * from "./hast/index.js"
20
+ export * from "./mdast/index.js"
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Schema transformation from Markdown string to MDAST (Markdown Abstract Syntax Tree).
3
+ *
4
+ * Uses remark-parse for Markdown parsing and wraps the result in Effect Schema types.
5
+ *
6
+ * @module
7
+ */
8
+ import * as Effect from "effect/Effect"
9
+ import * as ParseResult from "effect/ParseResult"
10
+ import * as Schema from "effect/Schema"
11
+ import remarkGfm from "remark-gfm"
12
+ import remarkParse from "remark-parse"
13
+ import remarkStringify from "remark-stringify"
14
+ import { unified } from "unified"
15
+ import type { MdastRoot } from "./MdastSchema.js"
16
+ import { makeMdastRoot, MdastRootSchema } from "./MdastSchema.js"
17
+
18
+ // Unist/Mdast types from remark-parse (simplified)
19
+ interface UnistNode {
20
+ type: string
21
+ value?: string
22
+ depth?: number
23
+ lang?: string
24
+ url?: string
25
+ title?: string | null
26
+ alt?: string | null
27
+ ordered?: boolean
28
+ start?: number
29
+ checked?: boolean | null
30
+ children?: Array<UnistNode>
31
+ }
32
+
33
+ interface UnistRoot {
34
+ type: "root"
35
+ children: Array<UnistNode>
36
+ }
37
+
38
+ /**
39
+ * Convert unist node from remark-parse to our MdastNode type.
40
+ * For now, we pass through the structure since MdastNode types match unist closely.
41
+ */
42
+ const convertToMdastRoot = (root: UnistRoot): MdastRoot =>
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ makeMdastRoot(root.children as any)
45
+
46
+ /**
47
+ * Convert our MdastRoot type back to unist format for serialization.
48
+ */
49
+ const convertFromMdastRoot = (root: MdastRoot): UnistRoot => ({
50
+ type: "root",
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ children: root.children as any
53
+ })
54
+
55
+ /**
56
+ * Transform Markdown string to MDAST root.
57
+ *
58
+ * Uses remark-parse to parse Markdown and converts the result to our schema types.
59
+ * Supports bidirectional transformation (decode Markdown -> MDAST, encode MDAST -> Markdown).
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * import { MdastFromMarkdown } from "@knpkv/confluence-to-markdown/schemas/mdast"
64
+ * import * as Schema from "effect/Schema"
65
+ * import { Effect } from "effect"
66
+ *
67
+ * const program = Effect.gen(function* () {
68
+ * const mdast = yield* Schema.decode(MdastFromMarkdown)("# Hello\n\nWorld")
69
+ * console.log(mdast.children.length) // 2
70
+ * console.log(mdast.children[0].type) // "heading"
71
+ * })
72
+ *
73
+ * Effect.runPromise(program)
74
+ * ```
75
+ *
76
+ * @category Mdast
77
+ */
78
+ export const MdastFromMarkdown = Schema.transformOrFail(
79
+ Schema.String,
80
+ MdastRootSchema,
81
+ {
82
+ strict: true,
83
+ decode: (markdown, _options, ast) =>
84
+ Effect.try({
85
+ try: () => {
86
+ const result = unified()
87
+ .use(remarkParse)
88
+ .use(remarkGfm)
89
+ .parse(markdown) as UnistRoot
90
+ return convertToMdastRoot(result)
91
+ },
92
+ catch: (error) =>
93
+ new ParseResult.Type(
94
+ ast,
95
+ markdown,
96
+ `Markdown parse error: ${error instanceof Error ? error.message : String(error)}`
97
+ )
98
+ }),
99
+ encode: (mdast, _options, ast) =>
100
+ Effect.try({
101
+ try: () => {
102
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+ const unist = convertFromMdastRoot(mdast as any)
104
+ return unified()
105
+ .use(remarkGfm)
106
+ .use(remarkStringify, { bullet: "-", emphasis: "_" })
107
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
108
+ .stringify(unist as any)
109
+ },
110
+ catch: (error) =>
111
+ new ParseResult.Type(
112
+ ast,
113
+ mdast,
114
+ `Markdown stringify error: ${error instanceof Error ? error.message : String(error)}`
115
+ )
116
+ })
117
+ }
118
+ )