@knpkv/confluence-to-markdown 0.5.0 → 0.7.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 (395) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +58 -14
  3. package/dist/AdfPlaceholders.d.ts +42 -0
  4. package/dist/AdfPlaceholders.d.ts.map +1 -0
  5. package/dist/AdfPlaceholders.js +547 -0
  6. package/dist/AdfPlaceholders.js.map +1 -0
  7. package/dist/AdfSchemaValidator.d.ts +37 -0
  8. package/dist/AdfSchemaValidator.d.ts.map +1 -0
  9. package/dist/AdfSchemaValidator.js +37 -0
  10. package/dist/AdfSchemaValidator.js.map +1 -0
  11. package/dist/AdfWalker.d.ts +39 -0
  12. package/dist/AdfWalker.d.ts.map +1 -0
  13. package/dist/AdfWalker.js +527 -0
  14. package/dist/AdfWalker.js.map +1 -0
  15. package/dist/AtlaskitTransformers.d.ts +35 -0
  16. package/dist/AtlaskitTransformers.d.ts.map +1 -0
  17. package/dist/AtlaskitTransformers.js +48 -0
  18. package/dist/AtlaskitTransformers.js.map +1 -0
  19. package/dist/Brand.d.ts +6 -6
  20. package/dist/Brand.d.ts.map +1 -1
  21. package/dist/Brand.js +8 -6
  22. package/dist/Brand.js.map +1 -1
  23. package/dist/ConfluenceAuth.d.ts +4 -4
  24. package/dist/ConfluenceAuth.d.ts.map +1 -1
  25. package/dist/ConfluenceAuth.js +15 -27
  26. package/dist/ConfluenceAuth.js.map +1 -1
  27. package/dist/ConfluenceClient.d.ts +4 -4
  28. package/dist/ConfluenceClient.d.ts.map +1 -1
  29. package/dist/ConfluenceClient.js +21 -14
  30. package/dist/ConfluenceClient.js.map +1 -1
  31. package/dist/ConfluenceConfig.d.ts +3 -3
  32. package/dist/ConfluenceConfig.d.ts.map +1 -1
  33. package/dist/ConfluenceConfig.js +13 -11
  34. package/dist/ConfluenceConfig.js.map +1 -1
  35. package/dist/ConfluenceError.d.ts +56 -4
  36. package/dist/ConfluenceError.d.ts.map +1 -1
  37. package/dist/ConfluenceError.js +30 -1
  38. package/dist/ConfluenceError.js.map +1 -1
  39. package/dist/GitService.d.ts +11 -3
  40. package/dist/GitService.d.ts.map +1 -1
  41. package/dist/GitService.js +19 -27
  42. package/dist/GitService.js.map +1 -1
  43. package/dist/LocalFileSystem.d.ts +3 -3
  44. package/dist/LocalFileSystem.d.ts.map +1 -1
  45. package/dist/LocalFileSystem.js +6 -6
  46. package/dist/LocalFileSystem.js.map +1 -1
  47. package/dist/MarkdownConverter.d.ts +16 -65
  48. package/dist/MarkdownConverter.d.ts.map +1 -1
  49. package/dist/MarkdownConverter.js +64 -85
  50. package/dist/MarkdownConverter.js.map +1 -1
  51. package/dist/Schemas.d.ts +128 -141
  52. package/dist/Schemas.d.ts.map +1 -1
  53. package/dist/Schemas.js +21 -23
  54. package/dist/Schemas.js.map +1 -1
  55. package/dist/SyncEngine.d.ts +8 -5
  56. package/dist/SyncEngine.d.ts.map +1 -1
  57. package/dist/SyncEngine.js +189 -113
  58. package/dist/SyncEngine.js.map +1 -1
  59. package/dist/bin.js +23 -35
  60. package/dist/bin.js.map +1 -1
  61. package/dist/commands/auth.d.ts +2 -14
  62. package/dist/commands/auth.d.ts.map +1 -1
  63. package/dist/commands/auth.js +11 -16
  64. package/dist/commands/auth.js.map +1 -1
  65. package/dist/commands/clone.d.ts +4 -6
  66. package/dist/commands/clone.d.ts.map +1 -1
  67. package/dist/commands/clone.js +34 -32
  68. package/dist/commands/clone.js.map +1 -1
  69. package/dist/commands/delete.d.ts +2 -10
  70. package/dist/commands/delete.d.ts.map +1 -1
  71. package/dist/commands/delete.js +5 -4
  72. package/dist/commands/delete.js.map +1 -1
  73. package/dist/commands/errorHandler.d.ts +2 -1
  74. package/dist/commands/errorHandler.d.ts.map +1 -1
  75. package/dist/commands/errorHandler.js +22 -15
  76. package/dist/commands/errorHandler.js.map +1 -1
  77. package/dist/commands/fetch.d.ts +27 -0
  78. package/dist/commands/fetch.d.ts.map +1 -0
  79. package/dist/commands/fetch.js +48 -0
  80. package/dist/commands/fetch.js.map +1 -0
  81. package/dist/commands/git.d.ts +7 -10
  82. package/dist/commands/git.d.ts.map +1 -1
  83. package/dist/commands/git.js +6 -6
  84. package/dist/commands/git.js.map +1 -1
  85. package/dist/commands/index.d.ts +1 -0
  86. package/dist/commands/index.d.ts.map +1 -1
  87. package/dist/commands/index.js +1 -0
  88. package/dist/commands/index.js.map +1 -1
  89. package/dist/commands/layers.d.ts +10 -9
  90. package/dist/commands/layers.d.ts.map +1 -1
  91. package/dist/commands/layers.js +41 -30
  92. package/dist/commands/layers.js.map +1 -1
  93. package/dist/commands/new.d.ts +2 -6
  94. package/dist/commands/new.d.ts.map +1 -1
  95. package/dist/commands/new.js +5 -4
  96. package/dist/commands/new.js.map +1 -1
  97. package/dist/commands/pageInput.d.ts +19 -0
  98. package/dist/commands/pageInput.d.ts.map +1 -0
  99. package/dist/commands/pageInput.js +68 -0
  100. package/dist/commands/pageInput.js.map +1 -0
  101. package/dist/commands/root.d.ts +8 -0
  102. package/dist/commands/root.d.ts.map +1 -0
  103. package/dist/commands/root.js +29 -0
  104. package/dist/commands/root.js.map +1 -0
  105. package/dist/commands/sync.d.ts +6 -9
  106. package/dist/commands/sync.d.ts.map +1 -1
  107. package/dist/commands/sync.js +5 -6
  108. package/dist/commands/sync.js.map +1 -1
  109. package/dist/index.d.ts +3 -8
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +2 -13
  112. package/dist/index.js.map +1 -1
  113. package/dist/internal/NodeLayers.d.ts.map +1 -1
  114. package/dist/internal/NodeLayers.js +1 -2
  115. package/dist/internal/NodeLayers.js.map +1 -1
  116. package/dist/internal/adfMetadata.d.ts +30 -0
  117. package/dist/internal/adfMetadata.d.ts.map +1 -0
  118. package/dist/internal/adfMetadata.js +126 -0
  119. package/dist/internal/adfMetadata.js.map +1 -0
  120. package/dist/internal/cleanMarkdown.d.ts +5 -0
  121. package/dist/internal/cleanMarkdown.d.ts.map +1 -0
  122. package/dist/internal/cleanMarkdown.js +13 -0
  123. package/dist/internal/cleanMarkdown.js.map +1 -0
  124. package/dist/internal/frontmatter.d.ts.map +1 -1
  125. package/dist/internal/frontmatter.js +41 -8
  126. package/dist/internal/frontmatter.js.map +1 -1
  127. package/dist/internal/gitCommands.d.ts +9 -3
  128. package/dist/internal/gitCommands.d.ts.map +1 -1
  129. package/dist/internal/gitCommands.js +18 -9
  130. package/dist/internal/gitCommands.js.map +1 -1
  131. package/dist/internal/hashUtils.d.ts +1 -1
  132. package/dist/internal/hashUtils.d.ts.map +1 -1
  133. package/dist/internal/hashUtils.js +1 -1
  134. package/dist/internal/hashUtils.js.map +1 -1
  135. package/dist/internal/oauthServer.d.ts +10 -5
  136. package/dist/internal/oauthServer.d.ts.map +1 -1
  137. package/dist/internal/oauthServer.js +19 -40
  138. package/dist/internal/oauthServer.js.map +1 -1
  139. package/dist/internal/pathUtils.d.ts +1 -1
  140. package/dist/internal/pathUtils.d.ts.map +1 -1
  141. package/dist/internal/pathUtils.js +1 -1
  142. package/dist/internal/pathUtils.js.map +1 -1
  143. package/dist/internal/process.d.ts +15 -0
  144. package/dist/internal/process.d.ts.map +1 -0
  145. package/dist/internal/process.js +10 -0
  146. package/dist/internal/process.js.map +1 -0
  147. package/dist/internal/stdio.d.ts +6 -0
  148. package/dist/internal/stdio.d.ts.map +1 -0
  149. package/dist/internal/stdio.js +15 -0
  150. package/dist/internal/stdio.js.map +1 -0
  151. package/dist/internal/tokenStorage.d.ts +3 -13
  152. package/dist/internal/tokenStorage.d.ts.map +1 -1
  153. package/dist/internal/tokenStorage.js +26 -24
  154. package/dist/internal/tokenStorage.js.map +1 -1
  155. package/dist/internal/userCache.d.ts +1 -1
  156. package/dist/internal/userCache.d.ts.map +1 -1
  157. package/dist/internal/userCache.js +1 -1
  158. package/dist/internal/userCache.js.map +1 -1
  159. package/package.json +29 -20
  160. package/skills/confluence/SKILL.md +143 -0
  161. package/skills/confluence/agents/openai.yaml +4 -0
  162. package/src/AdfPlaceholders.ts +563 -0
  163. package/src/AdfSchemaValidator.ts +65 -0
  164. package/src/AdfWalker.ts +591 -0
  165. package/src/AtlaskitTransformers.ts +70 -0
  166. package/src/Brand.ts +11 -16
  167. package/src/ConfluenceAuth.ts +22 -30
  168. package/src/ConfluenceClient.ts +28 -24
  169. package/src/ConfluenceConfig.ts +14 -14
  170. package/src/ConfluenceError.ts +65 -3
  171. package/src/GitService.ts +39 -49
  172. package/src/LocalFileSystem.ts +7 -9
  173. package/src/MarkdownConverter.ts +108 -143
  174. package/src/Schemas.ts +17 -16
  175. package/src/SyncEngine.ts +272 -127
  176. package/src/atlaskit-adf-schema.d.ts +3 -0
  177. package/src/bin.ts +30 -56
  178. package/src/commands/auth.ts +21 -18
  179. package/src/commands/clone.ts +46 -38
  180. package/src/commands/delete.ts +5 -4
  181. package/src/commands/errorHandler.ts +25 -18
  182. package/src/commands/fetch.ts +90 -0
  183. package/src/commands/git.ts +6 -6
  184. package/src/commands/index.ts +1 -0
  185. package/src/commands/layers.ts +64 -37
  186. package/src/commands/new.ts +5 -4
  187. package/src/commands/pageInput.ts +103 -0
  188. package/src/commands/root.ts +59 -0
  189. package/src/commands/sync.ts +7 -6
  190. package/src/index.ts +3 -18
  191. package/src/internal/NodeLayers.ts +1 -2
  192. package/src/internal/adfMetadata.ts +145 -0
  193. package/src/internal/cleanMarkdown.ts +15 -0
  194. package/src/internal/frontmatter.ts +45 -8
  195. package/src/internal/gitCommands.ts +23 -17
  196. package/src/internal/hashUtils.ts +2 -2
  197. package/src/internal/oauthServer.ts +84 -105
  198. package/src/internal/pathUtils.ts +1 -1
  199. package/src/internal/process.ts +15 -0
  200. package/src/internal/stdio.ts +22 -0
  201. package/src/internal/tokenStorage.ts +39 -29
  202. package/src/internal/userCache.ts +2 -2
  203. package/test/AdfPlaceholders.test.ts +508 -0
  204. package/test/AdfSchemaValidator.test.ts +34 -0
  205. package/test/AdfWalker.test.ts +676 -0
  206. package/test/AtlaskitTransformers.test.ts +25 -0
  207. package/test/Brand.test.ts +11 -11
  208. package/test/GitService.test.ts +6 -2
  209. package/test/MarkdownConverter.test.ts +121 -105
  210. package/test/RoundTrip.test.ts +521 -0
  211. package/test/Schemas.test.ts +40 -40
  212. package/test/adfMetadata.test.ts +110 -0
  213. package/test/cleanMarkdown.test.ts +36 -0
  214. package/test/commandHarness.test.ts +79 -0
  215. package/test/commandHarness.ts +147 -0
  216. package/test/fetch.test.ts +61 -0
  217. package/test/frontmatter.test.ts +41 -0
  218. package/test/integration.test.ts +569 -156
  219. package/test/layers.test.ts +12 -0
  220. package/test/oauthServer.test.ts +4 -5
  221. package/test/pageInput.test.ts +83 -0
  222. package/test/tokenStorage.test.ts +17 -17
  223. package/dist/SchemaConverterError.d.ts +0 -108
  224. package/dist/SchemaConverterError.d.ts.map +0 -1
  225. package/dist/SchemaConverterError.js +0 -84
  226. package/dist/SchemaConverterError.js.map +0 -1
  227. package/dist/ast/BlockNode.d.ts +0 -453
  228. package/dist/ast/BlockNode.d.ts.map +0 -1
  229. package/dist/ast/BlockNode.js +0 -310
  230. package/dist/ast/BlockNode.js.map +0 -1
  231. package/dist/ast/Document.d.ts +0 -216
  232. package/dist/ast/Document.d.ts.map +0 -1
  233. package/dist/ast/Document.js +0 -69
  234. package/dist/ast/Document.js.map +0 -1
  235. package/dist/ast/InlineNode.d.ts +0 -477
  236. package/dist/ast/InlineNode.d.ts.map +0 -1
  237. package/dist/ast/InlineNode.js +0 -263
  238. package/dist/ast/InlineNode.js.map +0 -1
  239. package/dist/ast/MacroNode.d.ts +0 -267
  240. package/dist/ast/MacroNode.d.ts.map +0 -1
  241. package/dist/ast/MacroNode.js +0 -164
  242. package/dist/ast/MacroNode.js.map +0 -1
  243. package/dist/ast/index.d.ts +0 -10
  244. package/dist/ast/index.d.ts.map +0 -1
  245. package/dist/ast/index.js +0 -14
  246. package/dist/ast/index.js.map +0 -1
  247. package/dist/parsers/ConfluenceParser.d.ts +0 -26
  248. package/dist/parsers/ConfluenceParser.d.ts.map +0 -1
  249. package/dist/parsers/ConfluenceParser.js +0 -797
  250. package/dist/parsers/ConfluenceParser.js.map +0 -1
  251. package/dist/parsers/MarkdownParser.d.ts +0 -26
  252. package/dist/parsers/MarkdownParser.d.ts.map +0 -1
  253. package/dist/parsers/MarkdownParser.js +0 -982
  254. package/dist/parsers/MarkdownParser.js.map +0 -1
  255. package/dist/parsers/index.d.ts +0 -8
  256. package/dist/parsers/index.d.ts.map +0 -1
  257. package/dist/parsers/index.js +0 -8
  258. package/dist/parsers/index.js.map +0 -1
  259. package/dist/schemas/ConfluenceSchema.d.ts +0 -21
  260. package/dist/schemas/ConfluenceSchema.d.ts.map +0 -1
  261. package/dist/schemas/ConfluenceSchema.js +0 -38
  262. package/dist/schemas/ConfluenceSchema.js.map +0 -1
  263. package/dist/schemas/ConversionSchema.d.ts +0 -35
  264. package/dist/schemas/ConversionSchema.d.ts.map +0 -1
  265. package/dist/schemas/ConversionSchema.js +0 -208
  266. package/dist/schemas/ConversionSchema.js.map +0 -1
  267. package/dist/schemas/MarkdownSchema.d.ts +0 -21
  268. package/dist/schemas/MarkdownSchema.d.ts.map +0 -1
  269. package/dist/schemas/MarkdownSchema.js +0 -38
  270. package/dist/schemas/MarkdownSchema.js.map +0 -1
  271. package/dist/schemas/hast/HastFromHtml.d.ts +0 -27
  272. package/dist/schemas/hast/HastFromHtml.d.ts.map +0 -1
  273. package/dist/schemas/hast/HastFromHtml.js +0 -107
  274. package/dist/schemas/hast/HastFromHtml.js.map +0 -1
  275. package/dist/schemas/hast/HastSchema.d.ts +0 -195
  276. package/dist/schemas/hast/HastSchema.d.ts.map +0 -1
  277. package/dist/schemas/hast/HastSchema.js +0 -183
  278. package/dist/schemas/hast/HastSchema.js.map +0 -1
  279. package/dist/schemas/hast/index.d.ts +0 -9
  280. package/dist/schemas/hast/index.d.ts.map +0 -1
  281. package/dist/schemas/hast/index.js +0 -3
  282. package/dist/schemas/hast/index.js.map +0 -1
  283. package/dist/schemas/index.d.ts +0 -14
  284. package/dist/schemas/index.d.ts.map +0 -1
  285. package/dist/schemas/index.js +0 -16
  286. package/dist/schemas/index.js.map +0 -1
  287. package/dist/schemas/mdast/MdastFromMarkdown.d.ts +0 -30
  288. package/dist/schemas/mdast/MdastFromMarkdown.d.ts.map +0 -1
  289. package/dist/schemas/mdast/MdastFromMarkdown.js +0 -79
  290. package/dist/schemas/mdast/MdastFromMarkdown.js.map +0 -1
  291. package/dist/schemas/mdast/MdastSchema.d.ts +0 -385
  292. package/dist/schemas/mdast/MdastSchema.d.ts.map +0 -1
  293. package/dist/schemas/mdast/MdastSchema.js +0 -266
  294. package/dist/schemas/mdast/MdastSchema.js.map +0 -1
  295. package/dist/schemas/mdast/index.d.ts +0 -10
  296. package/dist/schemas/mdast/index.d.ts.map +0 -1
  297. package/dist/schemas/mdast/index.js +0 -4
  298. package/dist/schemas/mdast/index.js.map +0 -1
  299. package/dist/schemas/mdast/mdastToString.d.ts +0 -13
  300. package/dist/schemas/mdast/mdastToString.d.ts.map +0 -1
  301. package/dist/schemas/mdast/mdastToString.js +0 -85
  302. package/dist/schemas/mdast/mdastToString.js.map +0 -1
  303. package/dist/schemas/nodes/block/BlockSchema.d.ts +0 -43
  304. package/dist/schemas/nodes/block/BlockSchema.d.ts.map +0 -1
  305. package/dist/schemas/nodes/block/BlockSchema.js +0 -634
  306. package/dist/schemas/nodes/block/BlockSchema.js.map +0 -1
  307. package/dist/schemas/nodes/block/index.d.ts +0 -7
  308. package/dist/schemas/nodes/block/index.d.ts.map +0 -1
  309. package/dist/schemas/nodes/block/index.js +0 -7
  310. package/dist/schemas/nodes/block/index.js.map +0 -1
  311. package/dist/schemas/nodes/index.d.ts +0 -9
  312. package/dist/schemas/nodes/index.d.ts.map +0 -1
  313. package/dist/schemas/nodes/index.js +0 -12
  314. package/dist/schemas/nodes/index.js.map +0 -1
  315. package/dist/schemas/nodes/inline/InlineSchema.d.ts +0 -48
  316. package/dist/schemas/nodes/inline/InlineSchema.d.ts.map +0 -1
  317. package/dist/schemas/nodes/inline/InlineSchema.js +0 -436
  318. package/dist/schemas/nodes/inline/InlineSchema.js.map +0 -1
  319. package/dist/schemas/nodes/inline/index.d.ts +0 -7
  320. package/dist/schemas/nodes/inline/index.d.ts.map +0 -1
  321. package/dist/schemas/nodes/inline/index.js +0 -7
  322. package/dist/schemas/nodes/inline/index.js.map +0 -1
  323. package/dist/schemas/nodes/macro/MacroSchema.d.ts +0 -27
  324. package/dist/schemas/nodes/macro/MacroSchema.d.ts.map +0 -1
  325. package/dist/schemas/nodes/macro/MacroSchema.js +0 -162
  326. package/dist/schemas/nodes/macro/MacroSchema.js.map +0 -1
  327. package/dist/schemas/nodes/macro/index.d.ts +0 -7
  328. package/dist/schemas/nodes/macro/index.d.ts.map +0 -1
  329. package/dist/schemas/nodes/macro/index.js +0 -7
  330. package/dist/schemas/nodes/macro/index.js.map +0 -1
  331. package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts +0 -24
  332. package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts.map +0 -1
  333. package/dist/schemas/preprocessing/ConfluencePreprocessor.js +0 -359
  334. package/dist/schemas/preprocessing/ConfluencePreprocessor.js.map +0 -1
  335. package/dist/schemas/preprocessing/index.d.ts +0 -8
  336. package/dist/schemas/preprocessing/index.d.ts.map +0 -1
  337. package/dist/schemas/preprocessing/index.js +0 -2
  338. package/dist/schemas/preprocessing/index.js.map +0 -1
  339. package/dist/serializers/ConfluenceSerializer.d.ts +0 -30
  340. package/dist/serializers/ConfluenceSerializer.d.ts.map +0 -1
  341. package/dist/serializers/ConfluenceSerializer.js +0 -560
  342. package/dist/serializers/ConfluenceSerializer.js.map +0 -1
  343. package/dist/serializers/MarkdownSerializer.d.ts +0 -34
  344. package/dist/serializers/MarkdownSerializer.d.ts.map +0 -1
  345. package/dist/serializers/MarkdownSerializer.js +0 -395
  346. package/dist/serializers/MarkdownSerializer.js.map +0 -1
  347. package/dist/serializers/index.d.ts +0 -8
  348. package/dist/serializers/index.d.ts.map +0 -1
  349. package/dist/serializers/index.js +0 -8
  350. package/dist/serializers/index.js.map +0 -1
  351. package/src/SchemaConverterError.ts +0 -108
  352. package/src/ast/BlockNode.ts +0 -469
  353. package/src/ast/Document.ts +0 -90
  354. package/src/ast/InlineNode.ts +0 -323
  355. package/src/ast/MacroNode.ts +0 -245
  356. package/src/ast/index.ts +0 -83
  357. package/src/parsers/ConfluenceParser.ts +0 -956
  358. package/src/parsers/MarkdownParser.ts +0 -1338
  359. package/src/parsers/index.ts +0 -8
  360. package/src/schemas/ConfluenceSchema.ts +0 -56
  361. package/src/schemas/ConversionSchema.ts +0 -318
  362. package/src/schemas/MarkdownSchema.ts +0 -56
  363. package/src/schemas/hast/HastFromHtml.ts +0 -153
  364. package/src/schemas/hast/HastSchema.ts +0 -274
  365. package/src/schemas/hast/index.ts +0 -35
  366. package/src/schemas/index.ts +0 -20
  367. package/src/schemas/mdast/MdastFromMarkdown.ts +0 -118
  368. package/src/schemas/mdast/MdastSchema.ts +0 -566
  369. package/src/schemas/mdast/index.ts +0 -59
  370. package/src/schemas/mdast/mdastToString.ts +0 -102
  371. package/src/schemas/nodes/block/BlockSchema.ts +0 -773
  372. package/src/schemas/nodes/block/index.ts +0 -13
  373. package/src/schemas/nodes/index.ts +0 -20
  374. package/src/schemas/nodes/inline/InlineSchema.ts +0 -523
  375. package/src/schemas/nodes/inline/index.ts +0 -14
  376. package/src/schemas/nodes/macro/MacroSchema.ts +0 -226
  377. package/src/schemas/nodes/macro/index.ts +0 -6
  378. package/src/schemas/preprocessing/ConfluencePreprocessor.ts +0 -455
  379. package/src/schemas/preprocessing/index.ts +0 -8
  380. package/src/serializers/ConfluenceSerializer.ts +0 -737
  381. package/src/serializers/MarkdownSerializer.ts +0 -543
  382. package/src/serializers/index.ts +0 -8
  383. package/test/ast/BlockNode.test.ts +0 -265
  384. package/test/ast/Document.test.ts +0 -126
  385. package/test/ast/InlineNode.test.ts +0 -161
  386. package/test/fixtures/integration-test.html.fixture +0 -103
  387. package/test/fixtures/integration-test.md.expected +0 -257
  388. package/test/parsers/ConfluenceParser.test.ts +0 -452
  389. package/test/schemas/ConfluencePreprocessor.test.ts +0 -180
  390. package/test/schemas/ConversionSchema.test.ts +0 -159
  391. package/test/schemas/HastSchema.test.ts +0 -138
  392. package/test/schemas/MdastSchema.test.ts +0 -145
  393. package/test/schemas/nodes/block/BlockSchema.test.ts +0 -173
  394. package/test/schemas/nodes/inline/InlineSchema.test.ts +0 -198
  395. package/test/schemas/nodes/macro/MacroSchema.test.ts +0 -142
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it } from "@effect/vitest"
2
+ import * as Effect from "effect/Effect"
3
+ import { AtlaskitTransformers, layer as AtlaskitTransformersLayer } from "../src/AtlaskitTransformers.js"
4
+
5
+ describe("AtlaskitTransformers", () => {
6
+ it.effect("encodes markdown to ADF JSON", () =>
7
+ Effect.gen(function*() {
8
+ const t = yield* AtlaskitTransformers
9
+ const adf = yield* t.use(({ json, md }) => json.encode(md.parse("# Hello")))
10
+ expect(adf.type).toBe("doc")
11
+ expect(adf.content[0]?.type).toBe("heading")
12
+ }).pipe(Effect.provide(AtlaskitTransformersLayer)))
13
+
14
+ it.effect("surfaces synchronous throws as AtlaskitTransformersError", () =>
15
+ Effect.gen(function*() {
16
+ const t = yield* AtlaskitTransformers
17
+ const result = yield* Effect.result(t.use(() => {
18
+ throw new Error("boom")
19
+ }))
20
+ expect(result._tag).toBe("Failure")
21
+ if (result._tag === "Failure") {
22
+ expect(result.failure._tag).toBe("AtlaskitTransformersError")
23
+ }
24
+ }).pipe(Effect.provide(AtlaskitTransformersLayer)))
25
+ })
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from "@effect/vitest"
2
- import * as Either from "effect/Either"
2
+ import * as Result from "effect/Result"
3
3
  import * as Schema from "effect/Schema"
4
4
  import { ContentHash, PageId, PageIdSchema, SpaceKey, SpaceKeySchema } from "../src/Brand.js"
5
5
 
@@ -17,13 +17,13 @@ describe("Brand", () => {
17
17
 
18
18
  describe("PageIdSchema", () => {
19
19
  it("decodes valid page IDs", () => {
20
- const result = Schema.decodeEither(PageIdSchema)("123456")
21
- expect(Either.isRight(result)).toBe(true)
20
+ const result = Schema.decodeUnknownResult(PageIdSchema)("123456")
21
+ expect(Result.isSuccess(result)).toBe(true)
22
22
  })
23
23
 
24
24
  it("rejects empty strings", () => {
25
- const result = Schema.decodeEither(PageIdSchema)("")
26
- expect(Either.isLeft(result)).toBe(true)
25
+ const result = Schema.decodeUnknownResult(PageIdSchema)("")
26
+ expect(Result.isFailure(result)).toBe(true)
27
27
  })
28
28
  })
29
29
 
@@ -40,18 +40,18 @@ describe("Brand", () => {
40
40
 
41
41
  describe("SpaceKeySchema", () => {
42
42
  it("decodes uppercase alphanumeric keys", () => {
43
- const result = Schema.decodeEither(SpaceKeySchema)("MYSPACE123")
44
- expect(Either.isRight(result)).toBe(true)
43
+ const result = Schema.decodeUnknownResult(SpaceKeySchema)("MYSPACE123")
44
+ expect(Result.isSuccess(result)).toBe(true)
45
45
  })
46
46
 
47
47
  it("rejects lowercase keys", () => {
48
- const result = Schema.decodeEither(SpaceKeySchema)("myspace")
49
- expect(Either.isLeft(result)).toBe(true)
48
+ const result = Schema.decodeUnknownResult(SpaceKeySchema)("myspace")
49
+ expect(Result.isFailure(result)).toBe(true)
50
50
  })
51
51
 
52
52
  it("rejects keys with special characters", () => {
53
- const result = Schema.decodeEither(SpaceKeySchema)("MY-SPACE")
54
- expect(Either.isLeft(result)).toBe(true)
53
+ const result = Schema.decodeUnknownResult(SpaceKeySchema)("MY-SPACE")
54
+ expect(Result.isFailure(result)).toBe(true)
55
55
  })
56
56
  })
57
57
 
@@ -1,5 +1,7 @@
1
+ import { NodeServices } from "@effect/platform-node"
1
2
  import { describe, expect, it } from "@effect/vitest"
2
3
  import * as Effect from "effect/Effect"
4
+ import * as Layer from "effect/Layer"
3
5
  import { GitService, layer as GitServiceLayer } from "../src/GitService.js"
4
6
  import { getConflictedFiles, GIT_LOG_FORMAT, parseGitLog, parseGitStatus } from "../src/internal/gitCommands.js"
5
7
 
@@ -7,6 +9,8 @@ import { getConflictedFiles, GIT_LOG_FORMAT, parseGitLog, parseGitStatus } from
7
9
  * Tests for git parsing utilities and GitService.
8
10
  */
9
11
  describe("GitService", () => {
12
+ const TestLayer = Layer.provideMerge(GitServiceLayer, NodeServices.layer)
13
+
10
14
  describe("parseGitStatus", () => {
11
15
  it("parses empty status", () => {
12
16
  const entries = parseGitStatus("")
@@ -197,13 +201,13 @@ M normal.ts`
197
201
  const git = yield* GitService
198
202
  const version = yield* git.validateGit()
199
203
  expect(version).toContain("git version")
200
- }).pipe(Effect.provide(GitServiceLayer)))
204
+ }).pipe(Effect.provide(TestLayer)))
201
205
 
202
206
  it.effect("isInitialized returns boolean", () =>
203
207
  Effect.gen(function*() {
204
208
  const git = yield* GitService
205
209
  const initialized = yield* git.isInitialized()
206
210
  expect(typeof initialized).toBe("boolean")
207
- }).pipe(Effect.provide(GitServiceLayer)))
211
+ }).pipe(Effect.provide(TestLayer)))
208
212
  })
209
213
  })
@@ -1,142 +1,158 @@
1
1
  import { describe, expect, it } from "@effect/vitest"
2
2
  import * as Effect from "effect/Effect"
3
- import { layer as MarkdownConverterLayer, MarkdownConverter, schemaBasedLayer } from "../src/MarkdownConverter.js"
3
+ import * as Layer from "effect/Layer"
4
+ import { layer as AdfSchemaValidatorLayer } from "../src/AdfSchemaValidator.js"
5
+ import { layer as AtlaskitTransformersLayer } from "../src/AtlaskitTransformers.js"
6
+ import { layer as MarkdownConverterLayer, MarkdownConverter } from "../src/MarkdownConverter.js"
4
7
 
5
- describe("MarkdownConverter", () => {
6
- describe("htmlToMarkdown", () => {
7
- it.effect("converts basic HTML to markdown", () =>
8
- Effect.gen(function*() {
9
- const converter = yield* MarkdownConverter
10
- const html = "<p>Hello <strong>world</strong></p>"
11
- const markdown = yield* converter.htmlToMarkdown(html)
12
- expect(markdown).toContain("Hello")
13
- expect(markdown).toContain("**world**")
14
- }).pipe(Effect.provide(MarkdownConverterLayer)))
8
+ const TestLayer = MarkdownConverterLayer.pipe(
9
+ Layer.provide(AtlaskitTransformersLayer),
10
+ Layer.provide(AdfSchemaValidatorLayer)
11
+ )
15
12
 
16
- it.effect("converts headings", () =>
17
- Effect.gen(function*() {
18
- const converter = yield* MarkdownConverter
19
- const html = "<h1>Title</h1><h2>Subtitle</h2>"
20
- const markdown = yield* converter.htmlToMarkdown(html)
21
- expect(markdown).toContain("# Title")
22
- expect(markdown).toContain("## Subtitle")
23
- }).pipe(Effect.provide(MarkdownConverterLayer)))
13
+ const minimalDoc = (content: ReadonlyArray<unknown>): string => JSON.stringify({ version: 1, type: "doc", content })
24
14
 
25
- it.effect("converts lists", () =>
26
- Effect.gen(function*() {
27
- const converter = yield* MarkdownConverter
28
- const html = "<ul><li>Item 1</li><li>Item 2</li></ul>"
29
- const markdown = yield* converter.htmlToMarkdown(html)
30
- // AST-based serializer uses - for unordered lists
31
- expect(markdown).toContain("- Item 1")
32
- expect(markdown).toContain("- Item 2")
33
- }).pipe(Effect.provide(MarkdownConverterLayer)))
34
-
35
- it.effect("converts links", () =>
15
+ describe("MarkdownConverter", () => {
16
+ describe("adfToMarkdown", () => {
17
+ it.effect("converts a heading", () =>
36
18
  Effect.gen(function*() {
37
19
  const converter = yield* MarkdownConverter
38
- const html = "<a href=\"https://example.com\">Link</a>"
39
- const markdown = yield* converter.htmlToMarkdown(html)
40
- expect(markdown).toContain("[Link](https://example.com)")
41
- }).pipe(Effect.provide(MarkdownConverterLayer)))
20
+ const md = yield* converter.adfToMarkdown(
21
+ minimalDoc([{ type: "heading", attrs: { level: 1 }, content: [{ type: "text", text: "Hello" }] }])
22
+ )
23
+ expect(md).toContain("# Hello")
24
+ }).pipe(Effect.provide(TestLayer)))
42
25
 
43
- it.effect("converts code blocks", () =>
26
+ it.effect("converts a paragraph with marks", () =>
44
27
  Effect.gen(function*() {
45
28
  const converter = yield* MarkdownConverter
46
- const html = "<pre><code>const x = 1;</code></pre>"
47
- const markdown = yield* converter.htmlToMarkdown(html)
48
- expect(markdown).toContain("```")
49
- expect(markdown).toContain("const x = 1;")
50
- }).pipe(Effect.provide(MarkdownConverterLayer)))
29
+ const md = yield* converter.adfToMarkdown(
30
+ minimalDoc([{
31
+ type: "paragraph",
32
+ content: [
33
+ { type: "text", text: "Hello " },
34
+ { type: "text", text: "world", marks: [{ type: "strong" }] }
35
+ ]
36
+ }])
37
+ )
38
+ expect(md).toContain("Hello")
39
+ expect(md).toContain("**world**")
40
+ }).pipe(Effect.provide(TestLayer)))
51
41
 
52
- it.effect("strips Confluence macros with rich-text-body", () =>
42
+ it.effect("converts a bullet list", () =>
53
43
  Effect.gen(function*() {
54
44
  const converter = yield* MarkdownConverter
55
- const html =
56
- "<ac:structured-macro ac:name=\"info\"><ac:rich-text-body><p>Content</p></ac:rich-text-body></ac:structured-macro>"
57
- const markdown = yield* converter.htmlToMarkdown(html)
58
- expect(markdown).toContain("Content")
59
- expect(markdown).not.toContain("ac:structured-macro")
60
- }).pipe(Effect.provide(MarkdownConverterLayer)))
45
+ const md = yield* converter.adfToMarkdown(
46
+ minimalDoc([{
47
+ type: "bulletList",
48
+ content: [
49
+ {
50
+ type: "listItem",
51
+ content: [{ type: "paragraph", content: [{ type: "text", text: "one" }] }]
52
+ },
53
+ {
54
+ type: "listItem",
55
+ content: [{ type: "paragraph", content: [{ type: "text", text: "two" }] }]
56
+ }
57
+ ]
58
+ }])
59
+ )
60
+ expect(md).toContain("- one")
61
+ expect(md).toContain("- two")
62
+ }).pipe(Effect.provide(TestLayer)))
61
63
 
62
- it.effect("converts Confluence code macros to code blocks", () =>
64
+ it.effect("converts a code block with language", () =>
63
65
  Effect.gen(function*() {
64
66
  const converter = yield* MarkdownConverter
65
- const html =
66
- "<ac:structured-macro ac:name=\"code\"><ac:plain-text-body><![CDATA[const x = 1;]]></ac:plain-text-body></ac:structured-macro>"
67
- const markdown = yield* converter.htmlToMarkdown(html)
68
- expect(markdown).toContain("const x = 1;")
69
- expect(markdown).toContain("```")
70
- }).pipe(Effect.provide(MarkdownConverterLayer)))
71
- })
67
+ const md = yield* converter.adfToMarkdown(
68
+ minimalDoc([{
69
+ type: "codeBlock",
70
+ attrs: { language: "ts" },
71
+ content: [{ type: "text", text: "const x = 1" }]
72
+ }])
73
+ )
74
+ expect(md).toContain("```ts")
75
+ expect(md).toContain("const x = 1")
76
+ }).pipe(Effect.provide(TestLayer)))
72
77
 
73
- describe("markdownToHtml", () => {
74
- it.effect("converts basic markdown to HTML", () =>
78
+ it.effect("converts a panel to a Confluence-preserving placeholder", () =>
75
79
  Effect.gen(function*() {
76
80
  const converter = yield* MarkdownConverter
77
- const markdown = "Hello **world**"
78
- const html = yield* converter.markdownToHtml(markdown)
79
- expect(html).toContain("<strong>world</strong>")
80
- }).pipe(Effect.provide(MarkdownConverterLayer)))
81
+ const md = yield* converter.adfToMarkdown(
82
+ minimalDoc([{
83
+ type: "panel",
84
+ attrs: { panelType: "info" },
85
+ content: [{ type: "paragraph", content: [{ type: "text", text: "heads up" }] }]
86
+ }])
87
+ )
88
+ expect(md).toContain("<!-- adf:panel type=info attrs=")
89
+ expect(md).toContain("heads up")
90
+ expect(md).toContain("<!-- adf:/panel -->")
91
+ }).pipe(Effect.provide(TestLayer)))
81
92
 
82
- it.effect("converts headings", () =>
93
+ it.effect("fails with ConversionError on invalid JSON", () =>
83
94
  Effect.gen(function*() {
84
95
  const converter = yield* MarkdownConverter
85
- const markdown = "# Title\n\n## Subtitle"
86
- const html = yield* converter.markdownToHtml(markdown)
87
- expect(html).toContain("<h1>Title</h1>")
88
- expect(html).toContain("<h2>Subtitle</h2>")
89
- }).pipe(Effect.provide(MarkdownConverterLayer)))
96
+ const result = yield* Effect.result(converter.adfToMarkdown("not json"))
97
+ expect(result._tag).toBe("Failure")
98
+ if (result._tag === "Failure") {
99
+ expect(result.failure._tag).toBe("ConversionError")
100
+ expect(result.failure.direction).toBe("adfToMarkdown")
101
+ }
102
+ }).pipe(Effect.provide(TestLayer)))
90
103
 
91
- it.effect("converts GFM tables", () =>
104
+ it.effect("treats schema-invalid incoming ADF as advisory and still converts", () =>
92
105
  Effect.gen(function*() {
93
106
  const converter = yield* MarkdownConverter
94
- const markdown = "| A | B |\n|---|---|\n| 1 | 2 |"
95
- const html = yield* converter.markdownToHtml(markdown)
96
- expect(html).toContain("<table>")
97
- expect(html).toContain("<th>A</th>")
98
- expect(html).toContain("<td>1</td>")
99
- }).pipe(Effect.provide(MarkdownConverterLayer)))
107
+ // Missing `version`, and `attrs.level` should be a number both are
108
+ // schema violations Confluence would never produce, but representative
109
+ // of the schema drift we tolerate on the incoming side.
110
+ const md = yield* converter.adfToMarkdown(JSON.stringify({
111
+ type: "doc",
112
+ content: [{
113
+ type: "heading",
114
+ attrs: { level: "1" },
115
+ content: [{ type: "text", text: "Hello" }]
116
+ }]
117
+ }))
118
+ expect(md).toContain("Hello")
119
+ }).pipe(Effect.provide(TestLayer)))
100
120
 
101
- it.effect("converts task lists", () =>
121
+ it.effect("still fails on input too malformed to walk", () =>
102
122
  Effect.gen(function*() {
123
+ // Advisory validation tolerates schema drift, not non-documents:
124
+ // walking `null` is a defect, `{}`/arrays silently produce an empty
125
+ // page that could overwrite a real local file.
103
126
  const converter = yield* MarkdownConverter
104
- const markdown = "- [ ] Todo\n- [x] Done"
105
- const html = yield* converter.markdownToHtml(markdown)
106
- expect(html).toContain("checkbox")
107
- }).pipe(Effect.provide(MarkdownConverterLayer)))
127
+ for (const bad of ["null", "{}", "[1,2]", `{"type":"doc","content":"not an array"}`]) {
128
+ const result = yield* Effect.result(converter.adfToMarkdown(bad))
129
+ expect(result._tag).toBe("Failure")
130
+ if (result._tag === "Failure") {
131
+ expect(result.failure._tag).toBe("ConversionError")
132
+ }
133
+ }
134
+ }).pipe(Effect.provide(TestLayer)))
108
135
  })
109
136
 
110
- describe("schemaBasedLayer", () => {
111
- it.effect("htmlToMarkdown converts basic HTML", () =>
112
- Effect.gen(function*() {
113
- const converter = yield* MarkdownConverter
114
- const html = "<h1>Title</h1><p>Hello world</p>"
115
- const markdown = yield* converter.htmlToMarkdown(html)
116
- expect(markdown).toContain("# Title")
117
- expect(markdown).toContain("Hello world")
118
- }).pipe(Effect.provide(schemaBasedLayer)))
119
-
120
- it.effect("htmlToAst parses HTML to Document", () =>
137
+ describe("markdownToAdf", () => {
138
+ it.effect("produces a valid ADF doc for a heading", () =>
121
139
  Effect.gen(function*() {
122
140
  const converter = yield* MarkdownConverter
123
- const html = "<h1>Title</h1><p>Content</p>"
124
- const doc = yield* converter.htmlToAst(html)
125
- expect(doc.version).toBe(1)
126
- expect(doc.children.length).toBe(2)
127
- expect(doc.children[0]?._tag).toBe("Heading")
128
- expect(doc.children[1]?._tag).toBe("Paragraph")
129
- }).pipe(Effect.provide(schemaBasedLayer)))
141
+ const adf = yield* converter.markdownToAdf("# Title\n\nBody")
142
+ const parsed = JSON.parse(adf) as { type: string; version: number; content: ReadonlyArray<{ type: string }> }
143
+ expect(parsed.type).toBe("doc")
144
+ expect(parsed.version).toBe(1)
145
+ expect(parsed.content[0]?.type).toBe("heading")
146
+ }).pipe(Effect.provide(TestLayer)))
130
147
 
131
- it.effect("markdownToAst parses Markdown to Document", () =>
148
+ it.effect("round-trips a heading + paragraph through both directions", () =>
132
149
  Effect.gen(function*() {
133
150
  const converter = yield* MarkdownConverter
134
- const md = "# Title\n\nContent"
135
- const doc = yield* converter.markdownToAst(md)
136
- expect(doc.version).toBe(1)
137
- expect(doc.children.length).toBe(2)
138
- expect(doc.children[0]?._tag).toBe("Heading")
139
- expect(doc.children[1]?._tag).toBe("Paragraph")
140
- }).pipe(Effect.provide(schemaBasedLayer)))
151
+ const md1 = "# Title\n\nHello **world**"
152
+ const adf = yield* converter.markdownToAdf(md1)
153
+ const md2 = yield* converter.adfToMarkdown(adf)
154
+ expect(md2).toContain("# Title")
155
+ expect(md2).toContain("**world**")
156
+ }).pipe(Effect.provide(TestLayer)))
141
157
  })
142
158
  })