@astryxdesign/core 0.6.1 → 0.6.2-canary.023c3e4

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 (305) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/BottomSheet/BottomSheet.d.ts +1 -1
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +3 -1
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
  6. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheetPanel.js +56 -19
  8. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  9. package/dist/Chat/ChatComposerInput.js +2 -2
  10. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  11. package/dist/CheckboxInput/CheckboxInput.js +12 -2
  12. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  13. package/dist/Collapsible/Collapsible.js +6 -1
  14. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  15. package/dist/CommandPalette/CommandPaletteInput.js +1 -1
  16. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  17. package/dist/ComplexSelector/ComplexSelector.js +1 -1
  18. package/dist/DateInput/DateInput.d.ts.map +1 -1
  19. package/dist/DateInput/DateInput.js +4 -4
  20. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  21. package/dist/DateInput/NativeDateField.js +16 -16
  22. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  23. package/dist/DateInput/TouchDateField.js +2 -2
  24. package/dist/DateRangeInput/DateRangeInput.d.ts +3 -0
  25. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  26. package/dist/DateRangeInput/DateRangeInput.js +20 -13
  27. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  28. package/dist/DateTimeInput/DateTimeInput.js +8 -8
  29. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  30. package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
  31. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
  32. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
  33. package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
  34. package/dist/Dialog/DialogHeader.d.ts +1 -1
  35. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  36. package/dist/Dialog/DialogHeader.js +10 -7
  37. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  38. package/dist/Field/PanelSearchInput.js +1 -1
  39. package/dist/FileInput/FileInput.d.ts.map +1 -1
  40. package/dist/FileInput/FileInput.js +16 -10
  41. package/dist/Kbd/Kbd.d.ts +5 -3
  42. package/dist/Kbd/Kbd.d.ts.map +1 -1
  43. package/dist/Kbd/Kbd.js +36 -42
  44. package/dist/Link/Link.d.ts.map +1 -1
  45. package/dist/Link/Link.js +6 -2
  46. package/dist/Markdown/Markdown.d.ts +18 -4
  47. package/dist/Markdown/Markdown.d.ts.map +1 -1
  48. package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
  49. package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
  50. package/dist/Markdown/Markdown.fr23.bench.js +150 -0
  51. package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
  52. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
  53. package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
  54. package/dist/Markdown/Markdown.js +311 -114
  55. package/dist/Markdown/ast.d.ts +162 -0
  56. package/dist/Markdown/ast.d.ts.map +1 -0
  57. package/dist/Markdown/ast.js +74 -0
  58. package/dist/Markdown/index.d.ts +5 -3
  59. package/dist/Markdown/index.d.ts.map +1 -1
  60. package/dist/Markdown/index.js +3 -2
  61. package/dist/Markdown/parser/index.d.ts +10 -0
  62. package/dist/Markdown/parser/index.d.ts.map +1 -0
  63. package/dist/Markdown/parser/index.js +10 -0
  64. package/dist/Markdown/parser.d.ts +220 -38
  65. package/dist/Markdown/parser.d.ts.map +1 -1
  66. package/dist/Markdown/parser.js +1072 -188
  67. package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
  68. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
  69. package/dist/Markdown/plugins/frontmatter.js +132 -0
  70. package/dist/Markdown/plugins/index.d.ts +16 -0
  71. package/dist/Markdown/plugins/index.d.ts.map +1 -0
  72. package/dist/Markdown/plugins/index.js +13 -0
  73. package/dist/Markdown/plugins/protocol.d.ts +191 -0
  74. package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
  75. package/dist/Markdown/plugins/protocol.js +957 -0
  76. package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
  77. package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
  78. package/dist/Markdown/plugins/semanticFence.js +213 -0
  79. package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
  80. package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
  81. package/dist/Markdown/plugins/sourceDecoration.js +393 -0
  82. package/dist/Markdown/plugins/textTransform.d.ts +30 -0
  83. package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
  84. package/dist/Markdown/plugins/textTransform.js +374 -0
  85. package/dist/Markdown/remark.d.ts +196 -0
  86. package/dist/Markdown/remark.d.ts.map +1 -0
  87. package/dist/Markdown/remark.js +1062 -0
  88. package/dist/Markdown/url.d.ts +4 -0
  89. package/dist/Markdown/url.d.ts.map +1 -0
  90. package/dist/Markdown/url.js +25 -0
  91. package/dist/Markdown/utils.d.ts +4 -2
  92. package/dist/Markdown/utils.d.ts.map +1 -1
  93. package/dist/Markdown/utils.js +2 -1
  94. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  95. package/dist/NumberInput/NumberInput.js +4 -4
  96. package/dist/Outline/index.d.ts +1 -0
  97. package/dist/Outline/index.d.ts.map +1 -1
  98. package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
  99. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  100. package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
  101. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
  102. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  103. package/dist/Outline/useOutlineFromMarkdown.js +8 -3
  104. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  105. package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
  106. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  107. package/dist/ProgressBar/ProgressBar.js +36 -31
  108. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  109. package/dist/RadioList/RadioListItem.js +13 -1
  110. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  111. package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
  112. package/dist/Selector/Selector.d.ts.map +1 -1
  113. package/dist/Selector/Selector.js +1 -1
  114. package/dist/SideNav/SideNav.d.ts +2 -1
  115. package/dist/SideNav/SideNav.d.ts.map +1 -1
  116. package/dist/SideNav/SideNav.js +9 -3
  117. package/dist/Slider/Slider.d.ts.map +1 -1
  118. package/dist/Slider/Slider.js +19 -10
  119. package/dist/Spinner/Spinner.d.ts +1 -1
  120. package/dist/Spinner/Spinner.d.ts.map +1 -1
  121. package/dist/Spinner/Spinner.js +45 -21
  122. package/dist/Switch/Switch.d.ts.map +1 -1
  123. package/dist/Switch/Switch.js +11 -0
  124. package/dist/TabList/Tab.d.ts +1 -1
  125. package/dist/TabList/Tab.d.ts.map +1 -1
  126. package/dist/TabList/Tab.js +20 -7
  127. package/dist/TextArea/TextArea.d.ts.map +1 -1
  128. package/dist/TextArea/TextArea.js +1 -1
  129. package/dist/TextInput/TextInput.d.ts.map +1 -1
  130. package/dist/TextInput/TextInput.js +2 -2
  131. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  132. package/dist/TimeInput/TimeInput.js +4 -4
  133. package/dist/ToggleButton/ToggleButton.d.ts +2 -1
  134. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  135. package/dist/ToggleButton/ToggleButton.js +7 -1
  136. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  137. package/dist/Typeahead/BaseTypeahead.js +16 -7
  138. package/dist/astryx.css +19 -8
  139. package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
  140. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
  141. package/dist/hooks/scrollKeyboardDelegation.js +146 -0
  142. package/dist/hooks/useScrollableArea.d.ts +6 -2
  143. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  144. package/dist/hooks/useScrollableArea.js +17 -5
  145. package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
  146. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  147. package/dist/utils/interactionOverlay.stylex.js +9 -0
  148. package/locales/en.json +16 -0
  149. package/locales/pseudo.json +12 -0
  150. package/package.json +22 -5
  151. package/scripts/agent-doc-state.mjs +1 -1
  152. package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
  153. package/src/BottomSheet/BottomSheet.spec.md +46 -20
  154. package/src/BottomSheet/BottomSheet.test.tsx +6 -3
  155. package/src/BottomSheet/BottomSheet.tsx +3 -1
  156. package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
  157. package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
  158. package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
  159. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
  160. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
  161. package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
  162. package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
  163. package/src/Button/__tests__/Button.a11y.states.ts +9 -0
  164. package/src/Chat/ChatComposerInput.doc.mjs +3 -3
  165. package/src/Chat/ChatComposerInput.tsx +10 -2
  166. package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
  167. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  168. package/src/CheckboxInput/CheckboxInput.tsx +21 -1
  169. package/src/ClickableCard/ClickableCard.test.tsx +102 -5
  170. package/src/Collapsible/Collapsible.doc.mjs +11 -0
  171. package/src/Collapsible/Collapsible.test.tsx +21 -0
  172. package/src/Collapsible/Collapsible.tsx +5 -0
  173. package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
  174. package/src/ComplexSelector/ComplexSelector.tsx +6 -1
  175. package/src/DateInput/DateInput.tsx +6 -1
  176. package/src/DateInput/NativeDateField.tsx +24 -8
  177. package/src/DateInput/TouchDateField.tsx +6 -2
  178. package/src/DateRangeInput/DateRangeInput.doc.mjs +35 -7
  179. package/src/DateRangeInput/DateRangeInput.spec.md +203 -0
  180. package/src/DateRangeInput/DateRangeInput.test.tsx +100 -4
  181. package/src/DateRangeInput/DateRangeInput.tsx +35 -21
  182. package/src/DateTimeInput/DateTimeInput.tsx +6 -1
  183. package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
  184. package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
  185. package/src/Dialog/Dialog.doc.mjs +3 -0
  186. package/src/Dialog/Dialog.spec.md +1 -1
  187. package/src/Dialog/DialogHeader.doc.mjs +38 -0
  188. package/src/Dialog/DialogHeader.test.tsx +49 -0
  189. package/src/Dialog/DialogHeader.tsx +23 -4
  190. package/src/Dialog/modules/DialogHeader.spec.md +152 -0
  191. package/src/Field/PanelSearchInput.tsx +5 -2
  192. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
  193. package/src/FileInput/FileInput.doc.mjs +2 -0
  194. package/src/FileInput/FileInput.spec.md +199 -0
  195. package/src/FileInput/FileInput.test.tsx +14 -0
  196. package/src/FileInput/FileInput.tsx +24 -5
  197. package/src/Kbd/Kbd.doc.mjs +3 -3
  198. package/src/Kbd/Kbd.test.tsx +57 -1
  199. package/src/Kbd/Kbd.tsx +57 -37
  200. package/src/Layout/LayoutFooter.doc.mjs +17 -0
  201. package/src/Link/Link.doc.mjs +11 -0
  202. package/src/Link/Link.test.tsx +24 -0
  203. package/src/Link/Link.tsx +5 -0
  204. package/src/Markdown/Markdown.doc.mjs +439 -42
  205. package/src/Markdown/Markdown.fr23.bench.ts +174 -0
  206. package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
  207. package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
  208. package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
  209. package/src/Markdown/Markdown.public.test.ts +280 -0
  210. package/src/Markdown/Markdown.spec.md +304 -72
  211. package/src/Markdown/Markdown.test.tsx +118 -3
  212. package/src/Markdown/Markdown.tsx +489 -129
  213. package/src/Markdown/ast.test.ts +307 -0
  214. package/src/Markdown/ast.ts +337 -0
  215. package/src/Markdown/incremental.test.ts +187 -7
  216. package/src/Markdown/index.ts +43 -1
  217. package/src/Markdown/modules/remark.spec.md +269 -0
  218. package/src/Markdown/parser/index.ts +64 -0
  219. package/src/Markdown/parser.perf.test.ts +3 -1
  220. package/src/Markdown/parser.public.test.ts +103 -0
  221. package/src/Markdown/parser.test.ts +122 -0
  222. package/src/Markdown/parser.ts +1721 -248
  223. package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
  224. package/src/Markdown/plugins/frontmatter.ts +198 -0
  225. package/src/Markdown/plugins/index.ts +53 -0
  226. package/src/Markdown/plugins/protocol.test.tsx +1022 -0
  227. package/src/Markdown/plugins/protocol.ts +1618 -0
  228. package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
  229. package/src/Markdown/plugins/semanticFence.ts +424 -0
  230. package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
  231. package/src/Markdown/plugins/sourceDecoration.ts +539 -0
  232. package/src/Markdown/plugins/textTransform.test.ts +467 -0
  233. package/src/Markdown/plugins/textTransform.ts +554 -0
  234. package/src/Markdown/remark.test.tsx +1877 -0
  235. package/src/Markdown/remark.ts +1574 -0
  236. package/src/Markdown/url.ts +30 -0
  237. package/src/Markdown/utils.ts +19 -1
  238. package/src/MultiSelector/MultiSelector.test.tsx +1 -35
  239. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
  240. package/src/NumberInput/NumberInput.tsx +6 -1
  241. package/src/Outline/Outline.doc.mjs +7 -5
  242. package/src/Outline/Outline.spec.md +1 -1
  243. package/src/Outline/index.ts +1 -0
  244. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
  245. package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
  246. package/src/Outline/useOutlineFromMarkdown.ts +15 -3
  247. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  248. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
  249. package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
  250. package/src/ProgressBar/ProgressBar.test.tsx +29 -11
  251. package/src/ProgressBar/ProgressBar.tsx +59 -72
  252. package/src/RadioList/RadioList.doc.mjs +11 -0
  253. package/src/RadioList/RadioList.test.tsx +32 -0
  254. package/src/RadioList/RadioListItem.tsx +25 -1
  255. package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
  256. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  257. package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
  258. package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
  259. package/src/Selector/Selector.spec.md +12 -9
  260. package/src/Selector/Selector.tsx +6 -1
  261. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
  262. package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
  263. package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
  264. package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
  265. package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
  266. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
  267. package/src/SideNav/SideNav.doc.mjs +1 -1
  268. package/src/SideNav/SideNav.test.tsx +10 -0
  269. package/src/SideNav/SideNav.tsx +14 -2
  270. package/src/Slider/Slider.doc.mjs +27 -0
  271. package/src/Slider/Slider.spec.md +61 -47
  272. package/src/Slider/Slider.test.tsx +146 -0
  273. package/src/Slider/Slider.tsx +37 -13
  274. package/src/Spinner/Spinner.doc.mjs +6 -3
  275. package/src/Spinner/Spinner.test.tsx +41 -0
  276. package/src/Spinner/Spinner.tsx +62 -32
  277. package/src/Switch/Switch.doc.mjs +11 -0
  278. package/src/Switch/Switch.test.tsx +16 -0
  279. package/src/Switch/Switch.tsx +28 -0
  280. package/src/TabList/Tab.tsx +35 -7
  281. package/src/TabList/TabList.doc.mjs +11 -0
  282. package/src/TabList/TabList.test.tsx +66 -0
  283. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
  284. package/src/TextArea/TextArea.tsx +6 -1
  285. package/src/TextInput/TextInput.test.tsx +20 -1
  286. package/src/TextInput/TextInput.tsx +6 -1
  287. package/src/TimeInput/TimeInput.tsx +6 -1
  288. package/src/ToggleButton/ToggleButton.test.tsx +133 -0
  289. package/src/ToggleButton/ToggleButton.tsx +9 -2
  290. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
  291. package/src/Tokenizer/Tokenizer.spec.md +142 -75
  292. package/src/TreeList/TreeList.spec.md +123 -75
  293. package/src/Typeahead/BaseTypeahead.spec.md +4 -3
  294. package/src/Typeahead/BaseTypeahead.tsx +21 -7
  295. package/src/Typeahead/Typeahead.test.tsx +53 -0
  296. package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
  297. package/src/__tests__/pressState.ts +93 -0
  298. package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
  299. package/src/hooks/scrollKeyboardDelegation.ts +233 -0
  300. package/src/hooks/useScrollableArea.doc.mjs +15 -3
  301. package/src/hooks/useScrollableArea.test.tsx +59 -1
  302. package/src/hooks/useScrollableArea.ts +34 -10
  303. package/src/inputFontFloor.test.ts +106 -0
  304. package/src/theme/derivedVarRegistry.test.ts +6 -4
  305. package/src/utils/interactionOverlay.stylex.ts +20 -0
@@ -0,0 +1,280 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Markdown.public.test.ts
5
+ * @input Imports Markdown parser, plugin factory, visitor, and node types from the public Markdown and plugin barrels
6
+ * @output Compile-time compatibility coverage for legacy, math-enabled, and plugin results
7
+ * @position Public API test guarding @astryxdesign/core/Markdown and /Markdown/plugins
8
+ */
9
+
10
+ import {describe, expectTypeOf, it} from 'vitest';
11
+ import {
12
+ createIncrementalState,
13
+ parseInline,
14
+ parseMarkdown,
15
+ parseMarkdownIncremental,
16
+ visitMarkdownNodes,
17
+ } from './index';
18
+ import {
19
+ createMarkdownFenceTransform,
20
+ createMarkdownPlugin,
21
+ createMarkdownTextTransform,
22
+ isMarkdownExtensionNode,
23
+ } from './plugins';
24
+ import type {
25
+ MarkdownExtensionNode,
26
+ MarkdownFenceTransformOptions,
27
+ MarkdownPluginEntry,
28
+ MarkdownSyntaxPluginDefinition,
29
+ MarkdownTransform,
30
+ } from './plugins';
31
+ import type {
32
+ BlockNode,
33
+ BlockNodeWithMath,
34
+ InlineNode,
35
+ InlineNodeWithMath,
36
+ ParseOptions,
37
+ } from './index';
38
+
39
+ function assertNever(value: never): never {
40
+ throw new Error(`Unexpected node: ${JSON.stringify(value)}`);
41
+ }
42
+
43
+ // Existing exhaustive consumers must not gain a new case when they do not opt
44
+ // into math parsing. These functions fail to compile if the legacy unions widen.
45
+ function legacyInlineText(node: InlineNode): string {
46
+ switch (node.type) {
47
+ case 'text':
48
+ case 'code':
49
+ return node.content;
50
+ case 'bold':
51
+ case 'italic':
52
+ case 'strikethrough':
53
+ case 'link':
54
+ return node.children.map(legacyInlineText).join('');
55
+ case 'image':
56
+ return node.alt;
57
+ case 'citation':
58
+ return node.sourceId;
59
+ case 'break':
60
+ return '\n';
61
+ default:
62
+ return assertNever(node);
63
+ }
64
+ }
65
+
66
+ function legacyBlockText(node: BlockNode): string {
67
+ switch (node.type) {
68
+ case 'heading':
69
+ case 'paragraph':
70
+ return node.children.map(legacyInlineText).join('');
71
+ case 'codeblock':
72
+ return node.content;
73
+ case 'blockquote':
74
+ return node.children.map(legacyBlockText).join('\n');
75
+ case 'list':
76
+ return node.items
77
+ .flatMap(item => item.children.map(legacyBlockText))
78
+ .join('\n');
79
+ case 'table':
80
+ return [...node.headers, ...node.rows.flat()]
81
+ .flatMap(cell => cell.children.map(legacyInlineText))
82
+ .join(' ');
83
+ case 'image':
84
+ return node.alt;
85
+ case 'hr':
86
+ return '';
87
+ default:
88
+ return assertNever(node);
89
+ }
90
+ }
91
+
92
+ describe('Markdown public parser types', () => {
93
+ it('keeps default and legacy parser calls on the legacy unions', () => {
94
+ expectTypeOf(parseInline('plain')).toEqualTypeOf<InlineNode[]>();
95
+ expectTypeOf(parseInline('plain', new Set<string>())).toEqualTypeOf<
96
+ InlineNode[]
97
+ >();
98
+ expectTypeOf(parseMarkdown('plain')).toEqualTypeOf<BlockNode[]>();
99
+ expectTypeOf(parseMarkdown('plain', {math: false})).toEqualTypeOf<
100
+ BlockNode[]
101
+ >();
102
+ const annotatedOptions: ParseOptions = {autolink: 'gfm'};
103
+ expectTypeOf(parseInline('plain', annotatedOptions)).toEqualTypeOf<
104
+ InlineNode[]
105
+ >();
106
+ expectTypeOf(parseMarkdown('plain', annotatedOptions)).toEqualTypeOf<
107
+ BlockNode[]
108
+ >();
109
+ expectTypeOf(
110
+ parseMarkdownIncremental(
111
+ 'plain',
112
+ createIncrementalState(),
113
+ annotatedOptions,
114
+ ),
115
+ ).toEqualTypeOf<BlockNode[]>();
116
+ expectTypeOf(
117
+ parseMarkdownIncremental('plain', createIncrementalState()),
118
+ ).toEqualTypeOf<BlockNode[]>();
119
+ expectTypeOf(createIncrementalState().settledBlocks).toEqualTypeOf<
120
+ BlockNode[]
121
+ >();
122
+ expectTypeOf(legacyInlineText).returns.toBeString();
123
+ expectTypeOf(legacyBlockText).returns.toBeString();
124
+ });
125
+
126
+ it('rejects ambiguous math options and structurally forged state', () => {
127
+ function compileOnlyGuards() {
128
+ const dynamicOptions: {math: boolean} = {math: true};
129
+ // @ts-expect-error callers must narrow to ParseOptions or MathParseOptions
130
+ parseMarkdown('$$x$$', dynamicOptions);
131
+
132
+ const structuralState = {
133
+ prevInput: '',
134
+ settledText: '',
135
+ settledBlocks: [] as BlockNode[],
136
+ settledUpTo: 0,
137
+ };
138
+ // @ts-expect-error math caches must come from createIncrementalState<true>()
139
+ parseMarkdownIncremental('$$x$$', structuralState, {math: true});
140
+ }
141
+
142
+ expectTypeOf(compileOnlyGuards).toBeFunction();
143
+ });
144
+
145
+ it('types direct and incremental math opt-ins with explicit math unions', () => {
146
+ const inline = parseInline('$x$', {math: true});
147
+ const direct = parseMarkdown('$$x$$', {math: true});
148
+ const incremental = parseMarkdownIncremental(
149
+ '$$x$$',
150
+ createIncrementalState<true>(),
151
+ {math: true},
152
+ );
153
+
154
+ // A state carries the same node contract as the parser result it caches.
155
+ // @ts-expect-error math parsing requires a math-enabled incremental state
156
+ parseMarkdownIncremental('$$x$$', createIncrementalState(), {math: true});
157
+
158
+ expectTypeOf(inline).toEqualTypeOf<InlineNodeWithMath[]>();
159
+ expectTypeOf(direct).toEqualTypeOf<BlockNodeWithMath[]>();
160
+ expectTypeOf(incremental).toEqualTypeOf<BlockNodeWithMath[]>();
161
+ expectTypeOf(createIncrementalState<true>().settledBlocks).toEqualTypeOf<
162
+ BlockNodeWithMath[]
163
+ >();
164
+ expectTypeOf<
165
+ Extract<InlineNodeWithMath, {type: 'math'}>['value']
166
+ >().toBeString();
167
+ expectTypeOf<
168
+ Extract<BlockNodeWithMath, {type: 'math'}>['value']
169
+ >().toBeString();
170
+ });
171
+
172
+ it('exports typed plugin construction and node-kind visitors', () => {
173
+ type PublicNode = MarkdownExtensionNode<
174
+ 'public-demo',
175
+ 'token',
176
+ {readonly label: string},
177
+ 'inline'
178
+ >;
179
+ const definition = {
180
+ name: 'public-demo',
181
+ apiVersion: 1,
182
+ parseKey: 'v1',
183
+ syntax: {
184
+ inline: [
185
+ {
186
+ startsWith: ['::'],
187
+ maxSpan: 20,
188
+ tokenize: () => ({status: 'no-match'}) as const,
189
+ },
190
+ ],
191
+ },
192
+ renderers: {
193
+ token: {
194
+ render: () => null,
195
+ toText: node => node.data.label,
196
+ },
197
+ },
198
+ } satisfies MarkdownSyntaxPluginDefinition<'public-demo', PublicNode>;
199
+ const plugin = createMarkdownPlugin<'public-demo', PublicNode>(definition);
200
+ const nodes = parseInline('plain', {plugins: [plugin] as const});
201
+
202
+ expectTypeOf(nodes).toEqualTypeOf<InlineNode<PublicNode>[]>();
203
+ expectTypeOf(visitMarkdownNodes).toBeFunction();
204
+ expectTypeOf(createMarkdownTextTransform).toBeFunction();
205
+ expectTypeOf(isMarkdownExtensionNode).toBeFunction();
206
+
207
+ function compileOnlyPluginGuards() {
208
+ // @ts-expect-error transforms that own extension nodes require renderers
209
+ createMarkdownPlugin<'public-demo', PublicNode>({
210
+ name: 'public-demo',
211
+ apiVersion: 1,
212
+ transform: root => root,
213
+ });
214
+ }
215
+ expectTypeOf(compileOnlyPluginGuards).toBeFunction();
216
+ });
217
+
218
+ it('exports a language-narrowed semantic fence transform helper', () => {
219
+ type PublicFenceNode = MarkdownExtensionNode<
220
+ 'public-semantic-fences',
221
+ 'diagram',
222
+ {
223
+ readonly code: string;
224
+ readonly language: 'mermaid' | 'dot';
225
+ readonly meta?: string;
226
+ },
227
+ 'block'
228
+ >;
229
+ const options = {
230
+ languages: ['mermaid', 'dot'] as const,
231
+ createNode: ({language, code, meta}) => {
232
+ expectTypeOf(language).toEqualTypeOf<'mermaid' | 'dot'>();
233
+ expectTypeOf(code).toBeString();
234
+ expectTypeOf(meta).toEqualTypeOf<string | undefined>();
235
+ return {
236
+ type: 'extension',
237
+ plugin: 'public-semantic-fences',
238
+ name: 'diagram',
239
+ display: 'block',
240
+ data: {
241
+ code,
242
+ language,
243
+ ...(meta == null ? {} : {meta}),
244
+ },
245
+ } as const;
246
+ },
247
+ } satisfies MarkdownFenceTransformOptions<
248
+ readonly ['mermaid', 'dot'],
249
+ PublicFenceNode
250
+ >;
251
+ const transform = createMarkdownFenceTransform(options);
252
+ const plugin = createMarkdownPlugin<
253
+ 'public-semantic-fences',
254
+ PublicFenceNode
255
+ >({
256
+ name: 'public-semantic-fences',
257
+ apiVersion: 1,
258
+ transform,
259
+ renderers: {
260
+ diagram: {
261
+ render: () => null,
262
+ toText: node => node.data.code,
263
+ },
264
+ },
265
+ });
266
+ const typedTransform: MarkdownTransform<PublicFenceNode> = transform;
267
+
268
+ expectTypeOf(typedTransform).toBeFunction();
269
+ expectTypeOf(plugin).toEqualTypeOf<MarkdownPluginEntry<PublicFenceNode>>();
270
+
271
+ function compileOnlyFenceGuards() {
272
+ createMarkdownFenceTransform({
273
+ languages: ['mermaid'],
274
+ // @ts-expect-error fence helpers create data nodes; render belongs in renderers
275
+ render: () => null,
276
+ });
277
+ }
278
+ expectTypeOf(compileOnlyFenceGuards).toBeFunction();
279
+ });
280
+ });