@health-samurai/react-components 0.0.0-alpha.2 → 0.0.0-alpha.21

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 (571) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -1
  3. package/dist/bundle.css +2349 -754
  4. package/dist/src/components/button-dropdown.d.ts +10 -0
  5. package/dist/src/components/button-dropdown.d.ts.map +1 -0
  6. package/dist/src/components/button-dropdown.js +70 -0
  7. package/dist/src/components/button-dropdown.js.map +1 -0
  8. package/dist/src/components/button-dropdown.stories.js +48 -0
  9. package/dist/src/components/button-dropdown.stories.js.map +1 -0
  10. package/dist/src/components/code-editor/fhir-autocomplete.d.ts +70 -0
  11. package/dist/src/components/code-editor/fhir-autocomplete.d.ts.map +1 -0
  12. package/dist/src/components/code-editor/fhir-autocomplete.js +1850 -0
  13. package/dist/src/components/code-editor/fhir-autocomplete.js.map +1 -0
  14. package/dist/src/components/code-editor/fhir-autocomplete.test.js +1099 -0
  15. package/dist/src/components/code-editor/fhir-autocomplete.test.js.map +1 -0
  16. package/dist/src/components/code-editor/http/grammar/http.d.ts +3 -0
  17. package/dist/src/components/code-editor/http/grammar/http.d.ts.map +1 -0
  18. package/dist/src/components/code-editor/http/grammar/http.grammar +74 -0
  19. package/dist/src/components/code-editor/http/grammar/http.js +38 -0
  20. package/dist/src/components/code-editor/http/grammar/http.js.map +1 -0
  21. package/dist/src/components/code-editor/http/grammar/http.terms.d.ts +2 -0
  22. package/dist/src/components/code-editor/http/grammar/http.terms.d.ts.map +1 -0
  23. package/dist/src/components/code-editor/http/grammar/http.terms.js +4 -0
  24. package/dist/src/components/code-editor/http/grammar/http.terms.js.map +1 -0
  25. package/dist/src/components/code-editor/http/grammar/http.test.js +80 -0
  26. package/dist/src/components/code-editor/http/grammar/http.test.js.map +1 -0
  27. package/dist/src/components/code-editor/http/index.d.ts +12 -0
  28. package/dist/src/components/code-editor/http/index.d.ts.map +1 -0
  29. package/dist/src/components/code-editor/http/index.js +486 -0
  30. package/dist/src/components/code-editor/http/index.js.map +1 -0
  31. package/dist/src/components/code-editor/index.d.ts +39 -1
  32. package/dist/src/components/code-editor/index.d.ts.map +1 -1
  33. package/dist/src/components/code-editor/index.js +1792 -45
  34. package/dist/src/components/code-editor/index.js.map +1 -1
  35. package/dist/src/components/code-editor/json-ast.d.ts +46 -0
  36. package/dist/src/components/code-editor/json-ast.d.ts.map +1 -0
  37. package/dist/src/components/code-editor/json-ast.js +465 -0
  38. package/dist/src/components/code-editor/json-ast.js.map +1 -0
  39. package/dist/src/components/code-editor/json-ast.test.js +206 -0
  40. package/dist/src/components/code-editor/json-ast.test.js.map +1 -0
  41. package/dist/src/components/code-editor/sql-completion.d.ts +22 -0
  42. package/dist/src/components/code-editor/sql-completion.d.ts.map +1 -0
  43. package/dist/src/components/code-editor/sql-completion.js +897 -0
  44. package/dist/src/components/code-editor/sql-completion.js.map +1 -0
  45. package/dist/src/components/code-editor.stories.js +280 -3
  46. package/dist/src/components/code-editor.stories.js.map +1 -1
  47. package/dist/src/components/copy-icon.d.ts +5 -1
  48. package/dist/src/components/copy-icon.d.ts.map +1 -1
  49. package/dist/src/components/copy-icon.js +41 -3
  50. package/dist/src/components/copy-icon.js.map +1 -1
  51. package/dist/src/components/data-table.d.ts +9 -0
  52. package/dist/src/components/data-table.d.ts.map +1 -0
  53. package/dist/src/components/data-table.js +66 -0
  54. package/dist/src/components/data-table.js.map +1 -0
  55. package/dist/src/components/data-table.stories.js +240 -0
  56. package/dist/src/components/data-table.stories.js.map +1 -0
  57. package/dist/src/components/date-picker-input.d.ts +10 -0
  58. package/dist/src/components/date-picker-input.d.ts.map +1 -0
  59. package/dist/src/components/date-picker-input.js +90 -0
  60. package/dist/src/components/date-picker-input.js.map +1 -0
  61. package/dist/src/components/date-picker-input.stories.js +76 -0
  62. package/dist/src/components/date-picker-input.stories.js.map +1 -0
  63. package/dist/src/components/fhir-structure-view.d.ts +34 -0
  64. package/dist/src/components/fhir-structure-view.d.ts.map +1 -0
  65. package/dist/src/components/fhir-structure-view.js +230 -0
  66. package/dist/src/components/fhir-structure-view.js.map +1 -0
  67. package/dist/src/components/fhir-structure-view.stories.js +447 -0
  68. package/dist/src/components/fhir-structure-view.stories.js.map +1 -0
  69. package/dist/src/components/icon-button.d.ts +12 -0
  70. package/dist/src/components/icon-button.d.ts.map +1 -0
  71. package/dist/src/components/icon-button.js +41 -0
  72. package/dist/src/components/icon-button.js.map +1 -0
  73. package/dist/src/components/icon-button.stories.js +157 -0
  74. package/dist/src/components/icon-button.stories.js.map +1 -0
  75. package/dist/src/components/operation-outcome-view.d.ts +27 -0
  76. package/dist/src/components/operation-outcome-view.d.ts.map +1 -0
  77. package/dist/src/components/operation-outcome-view.js +198 -0
  78. package/dist/src/components/operation-outcome-view.js.map +1 -0
  79. package/dist/src/components/operation-outcome-view.stories.js +207 -0
  80. package/dist/src/components/operation-outcome-view.stories.js.map +1 -0
  81. package/dist/src/components/request-line-editor.d.ts +13 -35
  82. package/dist/src/components/request-line-editor.d.ts.map +1 -1
  83. package/dist/src/components/request-line-editor.js +73 -49
  84. package/dist/src/components/request-line-editor.js.map +1 -1
  85. package/dist/src/components/request-line-editor.stories.js +17 -53
  86. package/dist/src/components/request-line-editor.stories.js.map +1 -1
  87. package/dist/src/components/sandbox.d.ts +13 -0
  88. package/dist/src/components/sandbox.d.ts.map +1 -0
  89. package/dist/src/components/sandbox.js +107 -0
  90. package/dist/src/components/sandbox.js.map +1 -0
  91. package/dist/src/components/sandbox.stories.js +126 -0
  92. package/dist/src/components/sandbox.stories.js.map +1 -0
  93. package/dist/src/components/segment-control.d.ts +13 -0
  94. package/dist/src/components/segment-control.d.ts.map +1 -0
  95. package/dist/src/components/segment-control.js +33 -0
  96. package/dist/src/components/segment-control.js.map +1 -0
  97. package/dist/src/components/segment-control.stories.js +68 -0
  98. package/dist/src/components/segment-control.stories.js.map +1 -0
  99. package/dist/src/components/split-button.d.ts +12 -0
  100. package/dist/src/components/split-button.d.ts.map +1 -0
  101. package/dist/src/components/split-button.js +33 -0
  102. package/dist/src/components/split-button.js.map +1 -0
  103. package/dist/src/components/split-button.stories.js +84 -0
  104. package/dist/src/components/split-button.stories.js.map +1 -0
  105. package/dist/src/components/tag.d.ts +16 -0
  106. package/dist/src/components/tag.d.ts.map +1 -0
  107. package/dist/src/components/tag.js +198 -0
  108. package/dist/src/components/tag.js.map +1 -0
  109. package/dist/src/components/tag.stories.js +459 -0
  110. package/dist/src/components/tag.stories.js.map +1 -0
  111. package/dist/src/components/tile.d.ts +15 -0
  112. package/dist/src/components/tile.d.ts.map +1 -0
  113. package/dist/src/components/tile.js +76 -0
  114. package/dist/src/components/tile.js.map +1 -0
  115. package/dist/src/components/tile.stories.js +167 -0
  116. package/dist/src/components/tile.stories.js.map +1 -0
  117. package/dist/src/components/toolbar.d.ts +18 -0
  118. package/dist/src/components/toolbar.d.ts.map +1 -0
  119. package/dist/src/components/toolbar.js +61 -0
  120. package/dist/src/components/toolbar.js.map +1 -0
  121. package/dist/src/components/toolbar.stories.js +69 -0
  122. package/dist/src/components/toolbar.stories.js.map +1 -0
  123. package/dist/src/components/tree-view.d.ts +47 -0
  124. package/dist/src/components/tree-view.d.ts.map +1 -0
  125. package/dist/src/components/tree-view.js +122 -0
  126. package/dist/src/components/tree-view.js.map +1 -0
  127. package/dist/src/components/tree-view.stories.js +283 -0
  128. package/dist/src/components/tree-view.stories.js.map +1 -0
  129. package/dist/src/icons.d.ts +11 -0
  130. package/dist/src/icons.d.ts.map +1 -0
  131. package/dist/src/icons.js +328 -0
  132. package/dist/src/icons.js.map +1 -0
  133. package/dist/src/index.css +358 -74
  134. package/dist/src/index.d.ts +17 -1
  135. package/dist/src/index.d.ts.map +1 -1
  136. package/dist/src/index.js +17 -1
  137. package/dist/src/index.js.map +1 -1
  138. package/dist/src/shadcn/components/ui/accordion.d.ts +2 -2
  139. package/dist/src/shadcn/components/ui/accordion.d.ts.map +1 -1
  140. package/dist/src/shadcn/components/ui/accordion.js +35 -9
  141. package/dist/src/shadcn/components/ui/accordion.js.map +1 -1
  142. package/dist/src/shadcn/components/ui/alert-dialog.d.ts +12 -4
  143. package/dist/src/shadcn/components/ui/alert-dialog.d.ts.map +1 -1
  144. package/dist/src/shadcn/components/ui/alert-dialog.js +128 -18
  145. package/dist/src/shadcn/components/ui/alert-dialog.js.map +1 -1
  146. package/dist/src/shadcn/components/ui/alert-dialog.stories.js +269 -19
  147. package/dist/src/shadcn/components/ui/alert-dialog.stories.js.map +1 -1
  148. package/dist/src/shadcn/components/ui/alert.d.ts +29 -6
  149. package/dist/src/shadcn/components/ui/alert.d.ts.map +1 -1
  150. package/dist/src/shadcn/components/ui/alert.js +50 -19
  151. package/dist/src/shadcn/components/ui/alert.js.map +1 -1
  152. package/dist/src/shadcn/components/ui/alert.stories.js +140 -36
  153. package/dist/src/shadcn/components/ui/alert.stories.js.map +1 -1
  154. package/dist/src/shadcn/components/ui/aspect-ratio.d.ts.map +1 -1
  155. package/dist/src/shadcn/components/ui/aspect-ratio.js +1 -0
  156. package/dist/src/shadcn/components/ui/aspect-ratio.js.map +1 -1
  157. package/dist/src/shadcn/components/ui/avatar.d.ts.map +1 -1
  158. package/dist/src/shadcn/components/ui/avatar.js +4 -3
  159. package/dist/src/shadcn/components/ui/avatar.js.map +1 -1
  160. package/dist/src/shadcn/components/ui/avatar.stories.js +68 -2
  161. package/dist/src/shadcn/components/ui/avatar.stories.js.map +1 -1
  162. package/dist/src/shadcn/components/ui/badge.d.ts +1 -1
  163. package/dist/src/shadcn/components/ui/badge.d.ts.map +1 -1
  164. package/dist/src/shadcn/components/ui/badge.js +16 -5
  165. package/dist/src/shadcn/components/ui/badge.js.map +1 -1
  166. package/dist/src/shadcn/components/ui/breadcrumb.d.ts +5 -2
  167. package/dist/src/shadcn/components/ui/breadcrumb.d.ts.map +1 -1
  168. package/dist/src/shadcn/components/ui/breadcrumb.js +98 -13
  169. package/dist/src/shadcn/components/ui/breadcrumb.js.map +1 -1
  170. package/dist/src/shadcn/components/ui/breadcrumb.stories.js +205 -45
  171. package/dist/src/shadcn/components/ui/breadcrumb.stories.js.map +1 -1
  172. package/dist/src/shadcn/components/ui/button.d.ts.map +1 -1
  173. package/dist/src/shadcn/components/ui/button.js +65 -11
  174. package/dist/src/shadcn/components/ui/button.js.map +1 -1
  175. package/dist/src/shadcn/components/ui/button.stories.js +99 -17
  176. package/dist/src/shadcn/components/ui/button.stories.js.map +1 -1
  177. package/dist/src/shadcn/components/ui/calendar.d.ts +1 -1
  178. package/dist/src/shadcn/components/ui/calendar.d.ts.map +1 -1
  179. package/dist/src/shadcn/components/ui/calendar.js +1 -0
  180. package/dist/src/shadcn/components/ui/calendar.js.map +1 -1
  181. package/dist/src/shadcn/components/ui/card.d.ts +5 -1
  182. package/dist/src/shadcn/components/ui/card.d.ts.map +1 -1
  183. package/dist/src/shadcn/components/ui/card.js +28 -7
  184. package/dist/src/shadcn/components/ui/card.js.map +1 -1
  185. package/dist/src/shadcn/components/ui/card.stories.js +23 -2
  186. package/dist/src/shadcn/components/ui/card.stories.js.map +1 -1
  187. package/dist/src/shadcn/components/ui/carousel.d.ts +1 -1
  188. package/dist/src/shadcn/components/ui/carousel.d.ts.map +1 -1
  189. package/dist/src/shadcn/components/ui/carousel.js +1 -0
  190. package/dist/src/shadcn/components/ui/carousel.js.map +1 -1
  191. package/dist/src/shadcn/components/ui/chart.d.ts +5 -5
  192. package/dist/src/shadcn/components/ui/chart.d.ts.map +1 -1
  193. package/dist/src/shadcn/components/ui/chart.js +4 -3
  194. package/dist/src/shadcn/components/ui/chart.js.map +1 -1
  195. package/dist/src/shadcn/components/ui/checkbox.d.ts +5 -1
  196. package/dist/src/shadcn/components/ui/checkbox.d.ts.map +1 -1
  197. package/dist/src/shadcn/components/ui/checkbox.js +46 -6
  198. package/dist/src/shadcn/components/ui/checkbox.js.map +1 -1
  199. package/dist/src/shadcn/components/ui/checkbox.stories.js +156 -46
  200. package/dist/src/shadcn/components/ui/checkbox.stories.js.map +1 -1
  201. package/dist/src/shadcn/components/ui/combobox.d.ts +29 -0
  202. package/dist/src/shadcn/components/ui/combobox.d.ts.map +1 -0
  203. package/dist/src/shadcn/components/ui/combobox.js +226 -0
  204. package/dist/src/shadcn/components/ui/combobox.js.map +1 -0
  205. package/dist/src/shadcn/components/ui/combobox.stories.js +167 -0
  206. package/dist/src/shadcn/components/ui/combobox.stories.js.map +1 -0
  207. package/dist/src/shadcn/components/ui/command.d.ts +4 -2
  208. package/dist/src/shadcn/components/ui/command.d.ts.map +1 -1
  209. package/dist/src/shadcn/components/ui/command.js +75 -13
  210. package/dist/src/shadcn/components/ui/command.js.map +1 -1
  211. package/dist/src/shadcn/components/ui/command.stories.js +277 -57
  212. package/dist/src/shadcn/components/ui/command.stories.js.map +1 -1
  213. package/dist/src/shadcn/components/ui/context-menu.d.ts +7 -3
  214. package/dist/src/shadcn/components/ui/context-menu.d.ts.map +1 -1
  215. package/dist/src/shadcn/components/ui/context-menu.js +120 -13
  216. package/dist/src/shadcn/components/ui/context-menu.js.map +1 -1
  217. package/dist/src/shadcn/components/ui/dialog.d.ts.map +1 -1
  218. package/dist/src/shadcn/components/ui/dialog.js +35 -7
  219. package/dist/src/shadcn/components/ui/dialog.js.map +1 -1
  220. package/dist/src/shadcn/components/ui/drawer.d.ts.map +1 -1
  221. package/dist/src/shadcn/components/ui/drawer.js +27 -5
  222. package/dist/src/shadcn/components/ui/drawer.js.map +1 -1
  223. package/dist/src/shadcn/components/ui/dropdown-menu.d.ts +7 -3
  224. package/dist/src/shadcn/components/ui/dropdown-menu.d.ts.map +1 -1
  225. package/dist/src/shadcn/components/ui/dropdown-menu.js +122 -14
  226. package/dist/src/shadcn/components/ui/dropdown-menu.js.map +1 -1
  227. package/dist/src/shadcn/components/ui/dropdown-menu.stories.js +22 -5
  228. package/dist/src/shadcn/components/ui/dropdown-menu.stories.js.map +1 -1
  229. package/dist/src/shadcn/components/ui/form.d.ts +2 -2
  230. package/dist/src/shadcn/components/ui/form.d.ts.map +1 -1
  231. package/dist/src/shadcn/components/ui/form.js +17 -8
  232. package/dist/src/shadcn/components/ui/form.js.map +1 -1
  233. package/dist/src/shadcn/components/ui/hover-card.d.ts.map +1 -1
  234. package/dist/src/shadcn/components/ui/hover-card.js +2 -1
  235. package/dist/src/shadcn/components/ui/hover-card.js.map +1 -1
  236. package/dist/src/shadcn/components/ui/input-otp.d.ts.map +1 -1
  237. package/dist/src/shadcn/components/ui/input-otp.js +1 -0
  238. package/dist/src/shadcn/components/ui/input-otp.js.map +1 -1
  239. package/dist/src/shadcn/components/ui/input.d.ts +3 -1
  240. package/dist/src/shadcn/components/ui/input.d.ts.map +1 -1
  241. package/dist/src/shadcn/components/ui/input.js +126 -17
  242. package/dist/src/shadcn/components/ui/input.js.map +1 -1
  243. package/dist/src/shadcn/components/ui/input.stories.js +218 -29
  244. package/dist/src/shadcn/components/ui/input.stories.js.map +1 -1
  245. package/dist/src/shadcn/components/ui/label.d.ts.map +1 -1
  246. package/dist/src/shadcn/components/ui/label.js +9 -1
  247. package/dist/src/shadcn/components/ui/label.js.map +1 -1
  248. package/dist/src/shadcn/components/ui/menubar.d.ts.map +1 -1
  249. package/dist/src/shadcn/components/ui/menubar.js +35 -13
  250. package/dist/src/shadcn/components/ui/menubar.js.map +1 -1
  251. package/dist/src/shadcn/components/ui/pagination.d.ts +9 -2
  252. package/dist/src/shadcn/components/ui/pagination.d.ts.map +1 -1
  253. package/dist/src/shadcn/components/ui/pagination.js +41 -24
  254. package/dist/src/shadcn/components/ui/pagination.js.map +1 -1
  255. package/dist/src/shadcn/components/ui/pagination.stories.js +44 -37
  256. package/dist/src/shadcn/components/ui/pagination.stories.js.map +1 -1
  257. package/dist/src/shadcn/components/ui/popover.d.ts.map +1 -1
  258. package/dist/src/shadcn/components/ui/popover.js +13 -1
  259. package/dist/src/shadcn/components/ui/popover.js.map +1 -1
  260. package/dist/src/shadcn/components/ui/progress.d.ts.map +1 -1
  261. package/dist/src/shadcn/components/ui/progress.js +6 -2
  262. package/dist/src/shadcn/components/ui/progress.js.map +1 -1
  263. package/dist/src/shadcn/components/ui/radio-button-group.d.ts +21 -0
  264. package/dist/src/shadcn/components/ui/radio-button-group.d.ts.map +1 -0
  265. package/dist/src/shadcn/components/ui/radio-button-group.js +148 -0
  266. package/dist/src/shadcn/components/ui/radio-button-group.js.map +1 -0
  267. package/dist/src/shadcn/components/ui/radio-button-group.stories.js +283 -0
  268. package/dist/src/shadcn/components/ui/radio-button-group.stories.js.map +1 -0
  269. package/dist/src/shadcn/components/ui/radio-group.d.ts +5 -1
  270. package/dist/src/shadcn/components/ui/radio-group.d.ts.map +1 -1
  271. package/dist/src/shadcn/components/ui/radio-group.js +40 -7
  272. package/dist/src/shadcn/components/ui/radio-group.js.map +1 -1
  273. package/dist/src/shadcn/components/ui/radio-group.stories.js +107 -32
  274. package/dist/src/shadcn/components/ui/radio-group.stories.js.map +1 -1
  275. package/dist/src/shadcn/components/ui/resizable.d.ts.map +1 -1
  276. package/dist/src/shadcn/components/ui/resizable.js +2 -1
  277. package/dist/src/shadcn/components/ui/resizable.js.map +1 -1
  278. package/dist/src/shadcn/components/ui/resizable.stories.js +2 -2
  279. package/dist/src/shadcn/components/ui/resizable.stories.js.map +1 -1
  280. package/dist/src/shadcn/components/ui/scroll-area.d.ts.map +1 -1
  281. package/dist/src/shadcn/components/ui/scroll-area.js +10 -3
  282. package/dist/src/shadcn/components/ui/scroll-area.js.map +1 -1
  283. package/dist/src/shadcn/components/ui/select.d.ts +1 -2
  284. package/dist/src/shadcn/components/ui/select.d.ts.map +1 -1
  285. package/dist/src/shadcn/components/ui/select.js +49 -19
  286. package/dist/src/shadcn/components/ui/select.js.map +1 -1
  287. package/dist/src/shadcn/components/ui/select.stories.js +193 -70
  288. package/dist/src/shadcn/components/ui/select.stories.js.map +1 -1
  289. package/dist/src/shadcn/components/ui/separator.d.ts.map +1 -1
  290. package/dist/src/shadcn/components/ui/separator.js +8 -1
  291. package/dist/src/shadcn/components/ui/separator.js.map +1 -1
  292. package/dist/src/shadcn/components/ui/sheet.js +1 -1
  293. package/dist/src/shadcn/components/ui/sheet.js.map +1 -1
  294. package/dist/src/shadcn/components/ui/sidebar.d.ts +4 -4
  295. package/dist/src/shadcn/components/ui/sidebar.d.ts.map +1 -1
  296. package/dist/src/shadcn/components/ui/sidebar.js +21 -6
  297. package/dist/src/shadcn/components/ui/sidebar.js.map +1 -1
  298. package/dist/src/shadcn/components/ui/skeleton.d.ts.map +1 -1
  299. package/dist/src/shadcn/components/ui/skeleton.js +3 -1
  300. package/dist/src/shadcn/components/ui/skeleton.js.map +1 -1
  301. package/dist/src/shadcn/components/ui/slider.d.ts.map +1 -1
  302. package/dist/src/shadcn/components/ui/slider.js +35 -4
  303. package/dist/src/shadcn/components/ui/slider.js.map +1 -1
  304. package/dist/src/shadcn/components/ui/sonner.d.ts +24 -2
  305. package/dist/src/shadcn/components/ui/sonner.d.ts.map +1 -1
  306. package/dist/src/shadcn/components/ui/sonner.js +127 -9
  307. package/dist/src/shadcn/components/ui/sonner.js.map +1 -1
  308. package/dist/src/shadcn/components/ui/sonner.stories.js +251 -12
  309. package/dist/src/shadcn/components/ui/sonner.stories.js.map +1 -1
  310. package/dist/src/shadcn/components/ui/switch.d.ts +7 -1
  311. package/dist/src/shadcn/components/ui/switch.d.ts.map +1 -1
  312. package/dist/src/shadcn/components/ui/switch.js +55 -3
  313. package/dist/src/shadcn/components/ui/switch.js.map +1 -1
  314. package/dist/src/shadcn/components/ui/switch.stories.js +84 -9
  315. package/dist/src/shadcn/components/ui/switch.stories.js.map +1 -1
  316. package/dist/src/shadcn/components/ui/table.d.ts +23 -6
  317. package/dist/src/shadcn/components/ui/table.d.ts.map +1 -1
  318. package/dist/src/shadcn/components/ui/table.js +65 -20
  319. package/dist/src/shadcn/components/ui/table.js.map +1 -1
  320. package/dist/src/shadcn/components/ui/table.stories.js +217 -97
  321. package/dist/src/shadcn/components/ui/table.stories.js.map +1 -1
  322. package/dist/src/shadcn/components/ui/tabs.d.ts +30 -5
  323. package/dist/src/shadcn/components/ui/tabs.d.ts.map +1 -1
  324. package/dist/src/shadcn/components/ui/tabs.js +470 -23
  325. package/dist/src/shadcn/components/ui/tabs.js.map +1 -1
  326. package/dist/src/shadcn/components/ui/tabs.stories.js +405 -181
  327. package/dist/src/shadcn/components/ui/tabs.stories.js.map +1 -1
  328. package/dist/src/shadcn/components/ui/textarea.d.ts +8 -1
  329. package/dist/src/shadcn/components/ui/textarea.d.ts.map +1 -1
  330. package/dist/src/shadcn/components/ui/textarea.js +30 -2
  331. package/dist/src/shadcn/components/ui/textarea.js.map +1 -1
  332. package/dist/src/shadcn/components/ui/textarea.stories.js +85 -4
  333. package/dist/src/shadcn/components/ui/textarea.stories.js.map +1 -1
  334. package/dist/src/shadcn/components/ui/toggle-group.d.ts +3 -3
  335. package/dist/src/shadcn/components/ui/toggle-group.d.ts.map +1 -1
  336. package/dist/src/shadcn/components/ui/toggle-group.js +14 -12
  337. package/dist/src/shadcn/components/ui/toggle-group.js.map +1 -1
  338. package/dist/src/shadcn/components/ui/toggle.d.ts +3 -4
  339. package/dist/src/shadcn/components/ui/toggle.d.ts.map +1 -1
  340. package/dist/src/shadcn/components/ui/toggle.js +44 -16
  341. package/dist/src/shadcn/components/ui/toggle.js.map +1 -1
  342. package/dist/src/shadcn/components/ui/toggle.stories.js +130 -7
  343. package/dist/src/shadcn/components/ui/toggle.stories.js.map +1 -1
  344. package/dist/src/shadcn/components/ui/tooltip.d.ts.map +1 -1
  345. package/dist/src/shadcn/components/ui/tooltip.js +12 -1
  346. package/dist/src/shadcn/components/ui/tooltip.js.map +1 -1
  347. package/dist/src/shadcn/components/ui/tree.d.ts +29 -0
  348. package/dist/src/shadcn/components/ui/tree.d.ts.map +1 -0
  349. package/dist/src/shadcn/components/ui/tree.js +135 -0
  350. package/dist/src/shadcn/components/ui/tree.js.map +1 -0
  351. package/dist/src/shadcn/shadcn.css +4 -4
  352. package/dist/src/tokens.css +50 -20
  353. package/dist/src/typography.css +78 -15
  354. package/package.json +84 -64
  355. package/src/components/button-dropdown.stories.tsx +41 -0
  356. package/src/components/button-dropdown.tsx +97 -0
  357. package/src/components/code-editor/fhir-autocomplete.test.ts +993 -0
  358. package/src/components/code-editor/fhir-autocomplete.ts +2322 -0
  359. package/src/components/code-editor/http/grammar/http.grammar +74 -0
  360. package/src/components/code-editor/http/grammar/http.terms.ts +9 -0
  361. package/src/components/code-editor/http/grammar/http.test.ts +110 -0
  362. package/src/components/code-editor/http/grammar/http.ts +21 -0
  363. package/src/components/code-editor/http/index.ts +424 -0
  364. package/src/components/code-editor/index.tsx +1944 -42
  365. package/src/components/code-editor/json-ast.test.ts +230 -0
  366. package/src/components/code-editor/json-ast.ts +590 -0
  367. package/src/components/code-editor/sql-completion.ts +1112 -0
  368. package/src/components/code-editor.stories.tsx +325 -2
  369. package/src/components/copy-icon.tsx +57 -3
  370. package/src/components/data-table.stories.tsx +91 -0
  371. package/src/components/data-table.tsx +126 -0
  372. package/src/components/date-picker-input.stories.tsx +79 -0
  373. package/src/components/date-picker-input.tsx +104 -0
  374. package/src/components/fhir-structure-view.stories.tsx +439 -0
  375. package/src/components/fhir-structure-view.tsx +233 -0
  376. package/src/components/icon-button.stories.tsx +86 -0
  377. package/src/components/icon-button.tsx +57 -0
  378. package/src/components/operation-outcome-view.stories.tsx +163 -0
  379. package/src/components/operation-outcome-view.tsx +254 -0
  380. package/src/components/request-line-editor.stories.tsx +17 -27
  381. package/src/components/request-line-editor.tsx +103 -61
  382. package/src/components/sandbox.stories.tsx +131 -0
  383. package/src/components/sandbox.tsx +191 -0
  384. package/src/components/segment-control.stories.tsx +61 -0
  385. package/src/components/segment-control.tsx +83 -0
  386. package/src/components/split-button.stories.tsx +68 -0
  387. package/src/components/split-button.tsx +74 -0
  388. package/src/components/tag.stories.tsx +371 -0
  389. package/src/components/tag.tsx +236 -0
  390. package/src/components/tile.stories.tsx +149 -0
  391. package/src/components/tile.tsx +105 -0
  392. package/src/components/toolbar.stories.tsx +64 -0
  393. package/src/components/toolbar.tsx +98 -0
  394. package/src/components/tree-view.stories.tsx +265 -0
  395. package/src/components/tree-view.tsx +246 -0
  396. package/src/icons.tsx +331 -0
  397. package/src/index.css +358 -74
  398. package/src/index.tsx +17 -3
  399. package/src/shadcn/components/ui/accordion.tsx +91 -10
  400. package/src/shadcn/components/ui/alert-dialog.stories.tsx +209 -15
  401. package/src/shadcn/components/ui/alert-dialog.tsx +236 -26
  402. package/src/shadcn/components/ui/alert.stories.tsx +120 -21
  403. package/src/shadcn/components/ui/alert.tsx +125 -28
  404. package/src/shadcn/components/ui/aspect-ratio.tsx +1 -0
  405. package/src/shadcn/components/ui/avatar.stories.tsx +74 -1
  406. package/src/shadcn/components/ui/avatar.tsx +22 -6
  407. package/src/shadcn/components/ui/badge.tsx +67 -18
  408. package/src/shadcn/components/ui/breadcrumb.stories.tsx +161 -41
  409. package/src/shadcn/components/ui/breadcrumb.tsx +172 -23
  410. package/src/shadcn/components/ui/button.stories.tsx +106 -18
  411. package/src/shadcn/components/ui/button.tsx +151 -55
  412. package/src/shadcn/components/ui/calendar.tsx +1 -0
  413. package/src/shadcn/components/ui/card.stories.tsx +17 -3
  414. package/src/shadcn/components/ui/card.tsx +89 -14
  415. package/src/shadcn/components/ui/carousel.tsx +1 -0
  416. package/src/shadcn/components/ui/chart.tsx +9 -5
  417. package/src/shadcn/components/ui/checkbox.stories.tsx +78 -30
  418. package/src/shadcn/components/ui/checkbox.tsx +91 -8
  419. package/src/shadcn/components/ui/combobox.stories.tsx +148 -0
  420. package/src/shadcn/components/ui/combobox.tsx +324 -0
  421. package/src/shadcn/components/ui/command.stories.tsx +184 -39
  422. package/src/shadcn/components/ui/command.tsx +218 -37
  423. package/src/shadcn/components/ui/context-menu.tsx +333 -40
  424. package/src/shadcn/components/ui/dialog.tsx +101 -13
  425. package/src/shadcn/components/ui/drawer.tsx +94 -18
  426. package/src/shadcn/components/ui/dropdown-menu.stories.tsx +18 -2
  427. package/src/shadcn/components/ui/dropdown-menu.tsx +334 -68
  428. package/src/shadcn/components/ui/form.tsx +22 -11
  429. package/src/shadcn/components/ui/hover-card.tsx +2 -1
  430. package/src/shadcn/components/ui/input-otp.tsx +1 -0
  431. package/src/shadcn/components/ui/input.stories.tsx +235 -27
  432. package/src/shadcn/components/ui/input.tsx +400 -29
  433. package/src/shadcn/components/ui/label.tsx +22 -4
  434. package/src/shadcn/components/ui/menubar.tsx +188 -43
  435. package/src/shadcn/components/ui/pagination.stories.tsx +8 -2
  436. package/src/shadcn/components/ui/pagination.tsx +65 -8
  437. package/src/shadcn/components/ui/popover.tsx +36 -4
  438. package/src/shadcn/components/ui/progress.tsx +21 -5
  439. package/src/shadcn/components/ui/radio-button-group.stories.tsx +247 -0
  440. package/src/shadcn/components/ui/radio-button-group.tsx +188 -0
  441. package/src/shadcn/components/ui/radio-group.stories.tsx +70 -14
  442. package/src/shadcn/components/ui/radio-group.tsx +85 -9
  443. package/src/shadcn/components/ui/resizable.stories.tsx +2 -2
  444. package/src/shadcn/components/ui/resizable.tsx +2 -1
  445. package/src/shadcn/components/ui/scroll-area.tsx +34 -5
  446. package/src/shadcn/components/ui/select.stories.tsx +108 -32
  447. package/src/shadcn/components/ui/select.tsx +182 -36
  448. package/src/shadcn/components/ui/separator.tsx +16 -5
  449. package/src/shadcn/components/ui/sheet.tsx +1 -1
  450. package/src/shadcn/components/ui/sidebar.tsx +69 -26
  451. package/src/shadcn/components/ui/skeleton.tsx +4 -1
  452. package/src/shadcn/components/ui/slider.tsx +83 -11
  453. package/src/shadcn/components/ui/sonner.stories.tsx +238 -17
  454. package/src/shadcn/components/ui/sonner.tsx +254 -11
  455. package/src/shadcn/components/ui/switch.stories.tsx +52 -5
  456. package/src/shadcn/components/ui/switch.tsx +92 -7
  457. package/src/shadcn/components/ui/table.stories.tsx +252 -72
  458. package/src/shadcn/components/ui/table.tsx +204 -26
  459. package/src/shadcn/components/ui/tabs.stories.tsx +235 -123
  460. package/src/shadcn/components/ui/tabs.tsx +694 -36
  461. package/src/shadcn/components/ui/textarea.stories.tsx +94 -2
  462. package/src/shadcn/components/ui/textarea.tsx +70 -5
  463. package/src/shadcn/components/ui/toggle-group.tsx +35 -13
  464. package/src/shadcn/components/ui/toggle.stories.tsx +92 -5
  465. package/src/shadcn/components/ui/toggle.tsx +96 -23
  466. package/src/shadcn/components/ui/tooltip.tsx +34 -8
  467. package/src/shadcn/components/ui/tree.tsx +257 -0
  468. package/src/shadcn/shadcn.css +4 -4
  469. package/src/tokens.css +50 -20
  470. package/src/typography.css +78 -15
  471. package/dist/src/components/code-editor.stories.d.ts +0 -7
  472. package/dist/src/components/code-editor.stories.d.ts.map +0 -1
  473. package/dist/src/components/request-line-editor.stories.d.ts +0 -11
  474. package/dist/src/components/request-line-editor.stories.d.ts.map +0 -1
  475. package/dist/src/index.stories.d.ts +0 -14
  476. package/dist/src/index.stories.d.ts.map +0 -1
  477. package/dist/src/index.stories.js +0 -19
  478. package/dist/src/index.stories.js.map +0 -1
  479. package/dist/src/shadcn/components/ui/accordion.stories.d.ts +0 -8
  480. package/dist/src/shadcn/components/ui/accordion.stories.d.ts.map +0 -1
  481. package/dist/src/shadcn/components/ui/alert-dialog.stories.d.ts +0 -8
  482. package/dist/src/shadcn/components/ui/alert-dialog.stories.d.ts.map +0 -1
  483. package/dist/src/shadcn/components/ui/alert.stories.d.ts +0 -8
  484. package/dist/src/shadcn/components/ui/alert.stories.d.ts.map +0 -1
  485. package/dist/src/shadcn/components/ui/aspect-ratio.stories.d.ts +0 -8
  486. package/dist/src/shadcn/components/ui/aspect-ratio.stories.d.ts.map +0 -1
  487. package/dist/src/shadcn/components/ui/avatar.stories.d.ts +0 -8
  488. package/dist/src/shadcn/components/ui/avatar.stories.d.ts.map +0 -1
  489. package/dist/src/shadcn/components/ui/badge.stories.d.ts +0 -8
  490. package/dist/src/shadcn/components/ui/badge.stories.d.ts.map +0 -1
  491. package/dist/src/shadcn/components/ui/breadcrumb.stories.d.ts +0 -8
  492. package/dist/src/shadcn/components/ui/breadcrumb.stories.d.ts.map +0 -1
  493. package/dist/src/shadcn/components/ui/button.stories.d.ts +0 -23
  494. package/dist/src/shadcn/components/ui/button.stories.d.ts.map +0 -1
  495. package/dist/src/shadcn/components/ui/calendar.stories.d.ts +0 -8
  496. package/dist/src/shadcn/components/ui/calendar.stories.d.ts.map +0 -1
  497. package/dist/src/shadcn/components/ui/card.stories.d.ts +0 -8
  498. package/dist/src/shadcn/components/ui/card.stories.d.ts.map +0 -1
  499. package/dist/src/shadcn/components/ui/carousel.stories.d.ts +0 -8
  500. package/dist/src/shadcn/components/ui/carousel.stories.d.ts.map +0 -1
  501. package/dist/src/shadcn/components/ui/chart.stories.d.ts +0 -8
  502. package/dist/src/shadcn/components/ui/chart.stories.d.ts.map +0 -1
  503. package/dist/src/shadcn/components/ui/checkbox.stories.d.ts +0 -8
  504. package/dist/src/shadcn/components/ui/checkbox.stories.d.ts.map +0 -1
  505. package/dist/src/shadcn/components/ui/collapsible.stories.d.ts +0 -8
  506. package/dist/src/shadcn/components/ui/collapsible.stories.d.ts.map +0 -1
  507. package/dist/src/shadcn/components/ui/command.stories.d.ts +0 -8
  508. package/dist/src/shadcn/components/ui/command.stories.d.ts.map +0 -1
  509. package/dist/src/shadcn/components/ui/context-menu.stories.d.ts +0 -8
  510. package/dist/src/shadcn/components/ui/context-menu.stories.d.ts.map +0 -1
  511. package/dist/src/shadcn/components/ui/dialog.stories.d.ts +0 -8
  512. package/dist/src/shadcn/components/ui/dialog.stories.d.ts.map +0 -1
  513. package/dist/src/shadcn/components/ui/drawer.stories.d.ts +0 -8
  514. package/dist/src/shadcn/components/ui/drawer.stories.d.ts.map +0 -1
  515. package/dist/src/shadcn/components/ui/dropdown-menu.stories.d.ts +0 -8
  516. package/dist/src/shadcn/components/ui/dropdown-menu.stories.d.ts.map +0 -1
  517. package/dist/src/shadcn/components/ui/form.stories.d.ts +0 -8
  518. package/dist/src/shadcn/components/ui/form.stories.d.ts.map +0 -1
  519. package/dist/src/shadcn/components/ui/hover-card.stories.d.ts +0 -8
  520. package/dist/src/shadcn/components/ui/hover-card.stories.d.ts.map +0 -1
  521. package/dist/src/shadcn/components/ui/input-otp.stories.d.ts +0 -8
  522. package/dist/src/shadcn/components/ui/input-otp.stories.d.ts.map +0 -1
  523. package/dist/src/shadcn/components/ui/input.stories.d.ts +0 -18
  524. package/dist/src/shadcn/components/ui/input.stories.d.ts.map +0 -1
  525. package/dist/src/shadcn/components/ui/label.stories.d.ts +0 -8
  526. package/dist/src/shadcn/components/ui/label.stories.d.ts.map +0 -1
  527. package/dist/src/shadcn/components/ui/menubar.stories.d.ts +0 -8
  528. package/dist/src/shadcn/components/ui/menubar.stories.d.ts.map +0 -1
  529. package/dist/src/shadcn/components/ui/navigation-menu.stories.d.ts +0 -8
  530. package/dist/src/shadcn/components/ui/navigation-menu.stories.d.ts.map +0 -1
  531. package/dist/src/shadcn/components/ui/pagination.stories.d.ts +0 -8
  532. package/dist/src/shadcn/components/ui/pagination.stories.d.ts.map +0 -1
  533. package/dist/src/shadcn/components/ui/popover.stories.d.ts +0 -8
  534. package/dist/src/shadcn/components/ui/popover.stories.d.ts.map +0 -1
  535. package/dist/src/shadcn/components/ui/progress.stories.d.ts +0 -8
  536. package/dist/src/shadcn/components/ui/progress.stories.d.ts.map +0 -1
  537. package/dist/src/shadcn/components/ui/radio-group.stories.d.ts +0 -8
  538. package/dist/src/shadcn/components/ui/radio-group.stories.d.ts.map +0 -1
  539. package/dist/src/shadcn/components/ui/resizable.stories.d.ts +0 -8
  540. package/dist/src/shadcn/components/ui/resizable.stories.d.ts.map +0 -1
  541. package/dist/src/shadcn/components/ui/scroll-area.stories.d.ts +0 -8
  542. package/dist/src/shadcn/components/ui/scroll-area.stories.d.ts.map +0 -1
  543. package/dist/src/shadcn/components/ui/select.stories.d.ts +0 -11
  544. package/dist/src/shadcn/components/ui/select.stories.d.ts.map +0 -1
  545. package/dist/src/shadcn/components/ui/separator.stories.d.ts +0 -8
  546. package/dist/src/shadcn/components/ui/separator.stories.d.ts.map +0 -1
  547. package/dist/src/shadcn/components/ui/sheet.stories.d.ts +0 -8
  548. package/dist/src/shadcn/components/ui/sheet.stories.d.ts.map +0 -1
  549. package/dist/src/shadcn/components/ui/sidebar.stories.d.ts +0 -11
  550. package/dist/src/shadcn/components/ui/sidebar.stories.d.ts.map +0 -1
  551. package/dist/src/shadcn/components/ui/skeleton.stories.d.ts +0 -8
  552. package/dist/src/shadcn/components/ui/skeleton.stories.d.ts.map +0 -1
  553. package/dist/src/shadcn/components/ui/slider.stories.d.ts +0 -8
  554. package/dist/src/shadcn/components/ui/slider.stories.d.ts.map +0 -1
  555. package/dist/src/shadcn/components/ui/sonner.stories.d.ts +0 -8
  556. package/dist/src/shadcn/components/ui/sonner.stories.d.ts.map +0 -1
  557. package/dist/src/shadcn/components/ui/switch.stories.d.ts +0 -8
  558. package/dist/src/shadcn/components/ui/switch.stories.d.ts.map +0 -1
  559. package/dist/src/shadcn/components/ui/table.stories.d.ts +0 -8
  560. package/dist/src/shadcn/components/ui/table.stories.d.ts.map +0 -1
  561. package/dist/src/shadcn/components/ui/tabs.stories.d.ts +0 -32
  562. package/dist/src/shadcn/components/ui/tabs.stories.d.ts.map +0 -1
  563. package/dist/src/shadcn/components/ui/textarea.stories.d.ts +0 -8
  564. package/dist/src/shadcn/components/ui/textarea.stories.d.ts.map +0 -1
  565. package/dist/src/shadcn/components/ui/toggle-group.stories.d.ts +0 -8
  566. package/dist/src/shadcn/components/ui/toggle-group.stories.d.ts.map +0 -1
  567. package/dist/src/shadcn/components/ui/toggle.stories.d.ts +0 -8
  568. package/dist/src/shadcn/components/ui/toggle.stories.d.ts.map +0 -1
  569. package/dist/src/shadcn/components/ui/tooltip.stories.d.ts +0 -8
  570. package/dist/src/shadcn/components/ui/tooltip.stories.d.ts.map +0 -1
  571. package/src/index.stories.tsx +0 -21
@@ -0,0 +1,1099 @@
1
+ import { CompletionContext } from "@codemirror/autocomplete";
2
+ import { json } from "@codemirror/lang-json";
3
+ import { EditorState } from "@codemirror/state";
4
+ import { describe, expect, it } from "vitest";
5
+ import { buildParameterSnippet, jsonCompletionSource } from "./fhir-autocomplete.js";
6
+ // ── Minimal mock SDs ───────────────────────────────────────────────────
7
+ const PATIENT_SD = {
8
+ type: "Patient",
9
+ url: "http://hl7.org/fhir/StructureDefinition/Patient",
10
+ baseDefinition: "http://hl7.org/fhir/StructureDefinition/DomainResource",
11
+ differential: {
12
+ element: [
13
+ {
14
+ path: "Patient",
15
+ min: 0,
16
+ max: "*"
17
+ },
18
+ {
19
+ path: "Patient.name",
20
+ min: 0,
21
+ max: "*",
22
+ type: [
23
+ {
24
+ code: "HumanName"
25
+ }
26
+ ]
27
+ },
28
+ {
29
+ path: "Patient.gender",
30
+ min: 0,
31
+ max: "1",
32
+ type: [
33
+ {
34
+ code: "code"
35
+ }
36
+ ],
37
+ binding: {
38
+ valueSet: "http://hl7.org/fhir/ValueSet/administrative-gender",
39
+ strength: "required"
40
+ }
41
+ },
42
+ {
43
+ path: "Patient.birthDate",
44
+ min: 0,
45
+ max: "1",
46
+ type: [
47
+ {
48
+ code: "date"
49
+ }
50
+ ]
51
+ },
52
+ {
53
+ path: "Patient.active",
54
+ min: 0,
55
+ max: "1",
56
+ type: [
57
+ {
58
+ code: "boolean"
59
+ }
60
+ ]
61
+ },
62
+ {
63
+ path: "Patient.managingOrganization",
64
+ min: 0,
65
+ max: "1",
66
+ type: [
67
+ {
68
+ code: "Reference",
69
+ targetProfile: [
70
+ "http://hl7.org/fhir/StructureDefinition/Organization"
71
+ ]
72
+ }
73
+ ]
74
+ },
75
+ {
76
+ path: "Patient.contained",
77
+ min: 0,
78
+ max: "*",
79
+ type: [
80
+ {
81
+ code: "Resource"
82
+ }
83
+ ]
84
+ },
85
+ {
86
+ path: "Patient.meta",
87
+ min: 0,
88
+ max: "1",
89
+ type: [
90
+ {
91
+ code: "Meta"
92
+ }
93
+ ]
94
+ }
95
+ ]
96
+ }
97
+ };
98
+ const OBSERVATION_SD = {
99
+ type: "Observation",
100
+ url: "http://hl7.org/fhir/StructureDefinition/Observation",
101
+ baseDefinition: "http://hl7.org/fhir/StructureDefinition/DomainResource",
102
+ differential: {
103
+ element: [
104
+ {
105
+ path: "Observation",
106
+ min: 0,
107
+ max: "*"
108
+ },
109
+ {
110
+ path: "Observation.status",
111
+ min: 1,
112
+ max: "1",
113
+ type: [
114
+ {
115
+ code: "code"
116
+ }
117
+ ]
118
+ },
119
+ {
120
+ path: "Observation.code",
121
+ min: 1,
122
+ max: "1",
123
+ type: [
124
+ {
125
+ code: "CodeableConcept"
126
+ }
127
+ ]
128
+ },
129
+ {
130
+ path: "Observation.subject",
131
+ min: 0,
132
+ max: "1",
133
+ type: [
134
+ {
135
+ code: "Reference",
136
+ targetProfile: [
137
+ "http://hl7.org/fhir/StructureDefinition/Patient",
138
+ "http://hl7.org/fhir/StructureDefinition/Group"
139
+ ]
140
+ }
141
+ ]
142
+ }
143
+ ]
144
+ }
145
+ };
146
+ const DOMAIN_RESOURCE_SD = {
147
+ type: "DomainResource",
148
+ url: "http://hl7.org/fhir/StructureDefinition/DomainResource",
149
+ baseDefinition: "http://hl7.org/fhir/StructureDefinition/Resource",
150
+ differential: {
151
+ element: [
152
+ {
153
+ path: "DomainResource",
154
+ min: 0,
155
+ max: "*"
156
+ },
157
+ {
158
+ path: "DomainResource.text",
159
+ min: 0,
160
+ max: "1",
161
+ type: [
162
+ {
163
+ code: "Narrative"
164
+ }
165
+ ]
166
+ },
167
+ {
168
+ path: "DomainResource.contained",
169
+ min: 0,
170
+ max: "*",
171
+ type: [
172
+ {
173
+ code: "Resource"
174
+ }
175
+ ]
176
+ },
177
+ {
178
+ path: "DomainResource.extension",
179
+ min: 0,
180
+ max: "*",
181
+ type: [
182
+ {
183
+ code: "Extension"
184
+ }
185
+ ]
186
+ },
187
+ {
188
+ path: "DomainResource.modifierExtension",
189
+ min: 0,
190
+ max: "*",
191
+ type: [
192
+ {
193
+ code: "Extension"
194
+ }
195
+ ]
196
+ }
197
+ ]
198
+ }
199
+ };
200
+ const RESOURCE_SD = {
201
+ type: "Resource",
202
+ url: "http://hl7.org/fhir/StructureDefinition/Resource",
203
+ differential: {
204
+ element: [
205
+ {
206
+ path: "Resource",
207
+ min: 0,
208
+ max: "*"
209
+ },
210
+ {
211
+ path: "Resource.id",
212
+ min: 0,
213
+ max: "1",
214
+ type: [
215
+ {
216
+ code: "id"
217
+ }
218
+ ]
219
+ },
220
+ {
221
+ path: "Resource.meta",
222
+ min: 0,
223
+ max: "1",
224
+ type: [
225
+ {
226
+ code: "Meta"
227
+ }
228
+ ]
229
+ }
230
+ ]
231
+ }
232
+ };
233
+ const HUMAN_NAME_SD = {
234
+ type: "HumanName",
235
+ url: "http://hl7.org/fhir/StructureDefinition/HumanName",
236
+ differential: {
237
+ element: [
238
+ {
239
+ path: "HumanName",
240
+ min: 0,
241
+ max: "*"
242
+ },
243
+ {
244
+ path: "HumanName.family",
245
+ min: 0,
246
+ max: "1",
247
+ type: [
248
+ {
249
+ code: "string"
250
+ }
251
+ ]
252
+ },
253
+ {
254
+ path: "HumanName.given",
255
+ min: 0,
256
+ max: "*",
257
+ type: [
258
+ {
259
+ code: "string"
260
+ }
261
+ ]
262
+ }
263
+ ]
264
+ }
265
+ };
266
+ const REFERENCE_SD = {
267
+ type: "Reference",
268
+ url: "http://hl7.org/fhir/StructureDefinition/Reference",
269
+ differential: {
270
+ element: [
271
+ {
272
+ path: "Reference",
273
+ min: 0,
274
+ max: "*"
275
+ },
276
+ {
277
+ path: "Reference.reference",
278
+ min: 0,
279
+ max: "1",
280
+ type: [
281
+ {
282
+ code: "string"
283
+ }
284
+ ]
285
+ },
286
+ {
287
+ path: "Reference.display",
288
+ min: 0,
289
+ max: "1",
290
+ type: [
291
+ {
292
+ code: "string"
293
+ }
294
+ ]
295
+ }
296
+ ]
297
+ }
298
+ };
299
+ const META_SD = {
300
+ type: "Meta",
301
+ url: "http://hl7.org/fhir/StructureDefinition/Meta",
302
+ differential: {
303
+ element: [
304
+ {
305
+ path: "Meta",
306
+ min: 0,
307
+ max: "*"
308
+ },
309
+ {
310
+ path: "Meta.profile",
311
+ min: 0,
312
+ max: "*",
313
+ type: [
314
+ {
315
+ code: "canonical",
316
+ targetProfile: [
317
+ "http://hl7.org/fhir/StructureDefinition/StructureDefinition"
318
+ ]
319
+ }
320
+ ]
321
+ }
322
+ ]
323
+ }
324
+ };
325
+ const BUNDLE_SD = {
326
+ type: "Bundle",
327
+ url: "http://hl7.org/fhir/StructureDefinition/Bundle",
328
+ baseDefinition: "http://hl7.org/fhir/StructureDefinition/Resource",
329
+ differential: {
330
+ element: [
331
+ {
332
+ path: "Bundle",
333
+ min: 0,
334
+ max: "*"
335
+ },
336
+ {
337
+ path: "Bundle.type",
338
+ min: 1,
339
+ max: "1",
340
+ type: [
341
+ {
342
+ code: "code"
343
+ }
344
+ ]
345
+ },
346
+ {
347
+ path: "Bundle.entry",
348
+ min: 0,
349
+ max: "*",
350
+ type: [
351
+ {
352
+ code: "BackboneElement"
353
+ }
354
+ ]
355
+ },
356
+ {
357
+ path: "Bundle.entry.resource",
358
+ min: 0,
359
+ max: "1",
360
+ type: [
361
+ {
362
+ code: "Resource"
363
+ }
364
+ ]
365
+ }
366
+ ]
367
+ }
368
+ };
369
+ const PARAMETERS_SD = {
370
+ type: "Parameters",
371
+ url: "http://hl7.org/fhir/StructureDefinition/Parameters",
372
+ baseDefinition: "http://hl7.org/fhir/StructureDefinition/Resource",
373
+ differential: {
374
+ element: [
375
+ {
376
+ path: "Parameters",
377
+ min: 0,
378
+ max: "*"
379
+ },
380
+ {
381
+ path: "Parameters.parameter",
382
+ min: 0,
383
+ max: "*",
384
+ type: [
385
+ {
386
+ code: "BackboneElement"
387
+ }
388
+ ]
389
+ },
390
+ {
391
+ path: "Parameters.parameter.name",
392
+ min: 1,
393
+ max: "1",
394
+ type: [
395
+ {
396
+ code: "string"
397
+ }
398
+ ]
399
+ },
400
+ {
401
+ path: "Parameters.parameter.value[x]",
402
+ min: 0,
403
+ max: "1",
404
+ type: [
405
+ {
406
+ code: "string"
407
+ },
408
+ {
409
+ code: "boolean"
410
+ },
411
+ {
412
+ code: "integer"
413
+ },
414
+ {
415
+ code: "code"
416
+ },
417
+ {
418
+ code: "Reference"
419
+ },
420
+ {
421
+ code: "CodeableConcept"
422
+ }
423
+ ]
424
+ },
425
+ {
426
+ path: "Parameters.parameter.resource",
427
+ min: 0,
428
+ max: "1",
429
+ type: [
430
+ {
431
+ code: "Resource"
432
+ }
433
+ ]
434
+ },
435
+ {
436
+ path: "Parameters.parameter.part",
437
+ min: 0,
438
+ max: "*",
439
+ contentReference: "#Parameters.parameter"
440
+ }
441
+ ]
442
+ }
443
+ };
444
+ const INSTALL_PARAMS_PROFILE = {
445
+ type: "Parameters",
446
+ url: "http://health-samurai.io/fhir/core/StructureDefinition/fhir-package-install-parameters",
447
+ baseDefinition: "http://hl7.org/fhir/StructureDefinition/Parameters",
448
+ differential: {
449
+ element: [
450
+ {
451
+ path: "Parameters.parameter",
452
+ min: 1
453
+ },
454
+ {
455
+ path: "Parameters.parameter",
456
+ sliceName: "package",
457
+ min: 1,
458
+ max: "*"
459
+ },
460
+ {
461
+ path: "Parameters.parameter.name",
462
+ fixedString: "package"
463
+ },
464
+ {
465
+ path: "Parameters.parameter",
466
+ sliceName: "registry",
467
+ min: 0,
468
+ max: "1"
469
+ },
470
+ {
471
+ path: "Parameters.parameter.name",
472
+ fixedString: "registry"
473
+ }
474
+ ]
475
+ }
476
+ };
477
+ const TYPED_PARAMS_PROFILE = {
478
+ type: "Parameters",
479
+ url: "http://example.com/StructureDefinition/typed-params",
480
+ baseDefinition: "http://hl7.org/fhir/StructureDefinition/Parameters",
481
+ differential: {
482
+ element: [
483
+ {
484
+ path: "Parameters.parameter",
485
+ sliceName: "count",
486
+ min: 1,
487
+ max: "1"
488
+ },
489
+ {
490
+ path: "Parameters.parameter.name",
491
+ fixedString: "count"
492
+ },
493
+ {
494
+ path: "Parameters.parameter.value[x]",
495
+ type: [
496
+ {
497
+ code: "integer"
498
+ }
499
+ ]
500
+ },
501
+ {
502
+ path: "Parameters.parameter",
503
+ sliceName: "label",
504
+ min: 0,
505
+ max: "1"
506
+ },
507
+ {
508
+ path: "Parameters.parameter.name",
509
+ fixedString: "label"
510
+ },
511
+ {
512
+ path: "Parameters.parameter.value[x]",
513
+ type: [
514
+ {
515
+ code: "string"
516
+ }
517
+ ]
518
+ }
519
+ ]
520
+ }
521
+ };
522
+ const TOPIC_DEST_SD = {
523
+ type: "AidboxTopicDestination",
524
+ url: "http://aidbox.app/StructureDefinition/AidboxTopicDestination",
525
+ baseDefinition: "http://hl7.org/fhir/StructureDefinition/Parameters",
526
+ differential: {
527
+ element: [
528
+ {
529
+ path: "AidboxTopicDestination",
530
+ min: 0,
531
+ max: "*"
532
+ },
533
+ {
534
+ path: "AidboxTopicDestination.kind",
535
+ min: 0,
536
+ max: "1",
537
+ type: [
538
+ {
539
+ code: "string"
540
+ }
541
+ ]
542
+ }
543
+ ]
544
+ }
545
+ };
546
+ const TOPIC_DEST_KAFKA_PROFILE = {
547
+ type: "AidboxTopicDestination",
548
+ url: "http://aidbox.app/StructureDefinition/aidboxtopicdestination-kafka-best-effort",
549
+ baseDefinition: "http://aidbox.app/StructureDefinition/AidboxTopicDestination",
550
+ differential: {
551
+ element: [
552
+ {
553
+ path: "AidboxTopicDestination.kind",
554
+ fixedString: "kafka-best-effort"
555
+ },
556
+ {
557
+ path: "AidboxTopicDestination.parameter",
558
+ sliceName: "kafkaTopic",
559
+ min: 1,
560
+ max: "1"
561
+ },
562
+ {
563
+ path: "AidboxTopicDestination.parameter.name",
564
+ fixedString: "kafkaTopic"
565
+ },
566
+ {
567
+ path: "AidboxTopicDestination.parameter.value[x]",
568
+ type: [
569
+ {
570
+ code: "string"
571
+ }
572
+ ]
573
+ },
574
+ {
575
+ path: "AidboxTopicDestination.parameter",
576
+ sliceName: "bootstrapServers",
577
+ min: 1,
578
+ max: "1"
579
+ },
580
+ {
581
+ path: "AidboxTopicDestination.parameter.name",
582
+ fixedString: "bootstrapServers"
583
+ },
584
+ {
585
+ path: "AidboxTopicDestination.parameter.value[x]",
586
+ type: [
587
+ {
588
+ code: "string"
589
+ }
590
+ ]
591
+ },
592
+ {
593
+ path: "AidboxTopicDestination.parameter",
594
+ sliceName: "batchSize",
595
+ min: 0,
596
+ max: "1"
597
+ },
598
+ {
599
+ path: "AidboxTopicDestination.parameter.name",
600
+ fixedString: "batchSize"
601
+ },
602
+ {
603
+ path: "AidboxTopicDestination.parameter.value[x]",
604
+ type: [
605
+ {
606
+ code: "integer"
607
+ }
608
+ ]
609
+ }
610
+ ]
611
+ }
612
+ };
613
+ const RESOURCE_TYPE_LIST = [
614
+ {
615
+ type: "Patient"
616
+ },
617
+ {
618
+ type: "Observation"
619
+ },
620
+ {
621
+ type: "Organization"
622
+ },
623
+ {
624
+ type: "Bundle"
625
+ },
626
+ {
627
+ type: "Parameters"
628
+ },
629
+ {
630
+ type: "AidboxTopicDestination"
631
+ }
632
+ ];
633
+ const ALL_SDS = {
634
+ Patient: PATIENT_SD,
635
+ Observation: OBSERVATION_SD,
636
+ DomainResource: DOMAIN_RESOURCE_SD,
637
+ Resource: RESOURCE_SD,
638
+ HumanName: HUMAN_NAME_SD,
639
+ Reference: REFERENCE_SD,
640
+ Meta: META_SD,
641
+ Bundle: BUNDLE_SD,
642
+ Parameters: PARAMETERS_SD,
643
+ "http://hl7.org/fhir/StructureDefinition/Patient": PATIENT_SD,
644
+ "http://hl7.org/fhir/StructureDefinition/Observation": OBSERVATION_SD,
645
+ "http://hl7.org/fhir/StructureDefinition/DomainResource": DOMAIN_RESOURCE_SD,
646
+ "http://hl7.org/fhir/StructureDefinition/Resource": RESOURCE_SD,
647
+ "http://hl7.org/fhir/StructureDefinition/HumanName": HUMAN_NAME_SD,
648
+ "http://hl7.org/fhir/StructureDefinition/Reference": REFERENCE_SD,
649
+ "http://hl7.org/fhir/StructureDefinition/Meta": META_SD,
650
+ "http://hl7.org/fhir/StructureDefinition/Bundle": BUNDLE_SD,
651
+ "http://hl7.org/fhir/StructureDefinition/Parameters": PARAMETERS_SD,
652
+ "http://health-samurai.io/fhir/core/StructureDefinition/fhir-package-install-parameters": INSTALL_PARAMS_PROFILE,
653
+ "http://example.com/StructureDefinition/typed-params": TYPED_PARAMS_PROFILE,
654
+ AidboxTopicDestination: TOPIC_DEST_SD,
655
+ "http://aidbox.app/StructureDefinition/AidboxTopicDestination": TOPIC_DEST_SD,
656
+ "http://aidbox.app/StructureDefinition/aidboxtopicdestination-kafka-best-effort": TOPIC_DEST_KAFKA_PROFILE
657
+ };
658
+ // ── Mock getSDs ────────────────────────────────────────────────────────
659
+ const mockGetSDs = async (params)=>{
660
+ if (params.kind === "resource" && params.derivation === "specialization") {
661
+ return RESOURCE_TYPE_LIST;
662
+ }
663
+ if (params.url) {
664
+ const sd = ALL_SDS[params.url];
665
+ return sd ? [
666
+ sd
667
+ ] : [];
668
+ }
669
+ if (params.type && params.derivation === "specialization") {
670
+ const sd = ALL_SDS[params.type];
671
+ return sd ? [
672
+ sd
673
+ ] : [];
674
+ }
675
+ if (params.type && params["derivation:missing"] === "true") {
676
+ const sd = ALL_SDS[params.type];
677
+ return sd ? [
678
+ sd
679
+ ] : [];
680
+ }
681
+ if (params.type === "Extension") {
682
+ return [];
683
+ }
684
+ return [];
685
+ };
686
+ const mockExpandValueSet = async (url, _filter)=>{
687
+ if (url === "http://hl7.org/fhir/ValueSet/administrative-gender") {
688
+ return [
689
+ {
690
+ code: "male",
691
+ display: "Male"
692
+ },
693
+ {
694
+ code: "female",
695
+ display: "Female"
696
+ },
697
+ {
698
+ code: "other",
699
+ display: "Other"
700
+ },
701
+ {
702
+ code: "unknown",
703
+ display: "Unknown"
704
+ }
705
+ ];
706
+ }
707
+ return [];
708
+ };
709
+ // ── Test helpers ───────────────────────────────────────────────────────
710
+ function completionAt(doc, marker = "|") {
711
+ const pos = doc.indexOf(marker);
712
+ const text = doc.slice(0, pos) + doc.slice(pos + 1);
713
+ const state = EditorState.create({
714
+ doc: text,
715
+ extensions: [
716
+ json()
717
+ ]
718
+ });
719
+ const cc = new CompletionContext(state, pos, true);
720
+ return {
721
+ state,
722
+ cc,
723
+ pos
724
+ };
725
+ }
726
+ function labels(result) {
727
+ return result?.options.map((o)=>o.label) ?? [];
728
+ }
729
+ // ── Caches persist across tests — clear between describes ──────────────
730
+ // The SD cache is module-level in fhir-autocomplete.ts.
731
+ // Since we use consistent mock data, the cache doesn't cause issues.
732
+ // ── Tests ──────────────────────────────────────────────────────────────
733
+ describe("fhir-autocomplete: jsonCompletionSource", ()=>{
734
+ const source = jsonCompletionSource(mockGetSDs, undefined, mockExpandValueSet);
735
+ describe("resourceType value completions", ()=>{
736
+ it("offers resource types in empty resourceType value", async ()=>{
737
+ const { cc } = completionAt('{\n "resourceType": "|\n}');
738
+ const result = await source(cc);
739
+ const l = labels(result);
740
+ expect(l).toContain("Patient");
741
+ expect(l).toContain("Observation");
742
+ expect(l).toContain("Organization");
743
+ });
744
+ });
745
+ describe("property completions", ()=>{
746
+ it("offers Patient fields when resourceType is set", async ()=>{
747
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n |\n}');
748
+ const result = await source(cc);
749
+ const l = labels(result);
750
+ expect(l).toContain("name");
751
+ expect(l).toContain("gender");
752
+ expect(l).toContain("birthDate");
753
+ expect(l).toContain("managingOrganization");
754
+ });
755
+ it("offers resourceType when no resourceType is set", async ()=>{
756
+ const { cc } = completionAt("{\n |\n}");
757
+ const result = await source(cc);
758
+ const l = labels(result);
759
+ expect(l).toContain("resourceType");
760
+ });
761
+ it("offers primitive extensions (_birthDate)", async ()=>{
762
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n |\n}');
763
+ const result = await source(cc);
764
+ const l = labels(result);
765
+ expect(l).toContain("_birthDate");
766
+ expect(l).toContain("_gender");
767
+ });
768
+ it("excludes properties already present in object", async ()=>{
769
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "gender": "male",\n |\n}');
770
+ const result = await source(cc);
771
+ const l = labels(result);
772
+ expect(l).toContain("name");
773
+ expect(l).toContain("birthDate");
774
+ expect(l).not.toContain("gender");
775
+ expect(l).not.toContain("resourceType");
776
+ });
777
+ it("does not offer property completions inside arrays", async ()=>{
778
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "name": [\n |\n ]\n}');
779
+ const result = await source(cc);
780
+ expect(result).toBe(null);
781
+ });
782
+ });
783
+ describe("property completions with resourceTypeHint", ()=>{
784
+ const hintSource = jsonCompletionSource(mockGetSDs, "Patient", mockExpandValueSet);
785
+ it("uses hint when resourceType is not in document", async ()=>{
786
+ const { cc } = completionAt("{\n |\n}");
787
+ const result = await hintSource(cc);
788
+ const l = labels(result);
789
+ expect(l).toContain("name");
790
+ expect(l).toContain("gender");
791
+ });
792
+ });
793
+ describe("terminology binding completions", ()=>{
794
+ it("offers gender codes for Patient.gender", async ()=>{
795
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "gender": "|\n}');
796
+ const result = await source(cc);
797
+ const l = labels(result);
798
+ expect(l).toContain("male");
799
+ expect(l).toContain("female");
800
+ expect(l).toContain("other");
801
+ expect(l).toContain("unknown");
802
+ });
803
+ });
804
+ describe("boolean value completions", ()=>{
805
+ it("offers true and false for boolean fields", async ()=>{
806
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "active": |\n}');
807
+ const result = await source(cc);
808
+ const l = labels(result);
809
+ expect(l).toContain("true");
810
+ expect(l).toContain("false");
811
+ expect(l).toHaveLength(2);
812
+ });
813
+ it("offers property completions (not booleans) on new line after boolean value", async ()=>{
814
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "active": true,\n |\n}');
815
+ const result = await source(cc);
816
+ const l = labels(result);
817
+ expect(l).not.toContain("true");
818
+ expect(l).not.toContain("false");
819
+ expect(l).toContain("name");
820
+ expect(l).toContain("gender");
821
+ });
822
+ });
823
+ describe("reference target completions", ()=>{
824
+ it("offers Organization/ for Patient.managingOrganization.reference", async ()=>{
825
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "managingOrganization": {\n "reference": "|\n }\n}');
826
+ const result = await source(cc);
827
+ const l = labels(result);
828
+ expect(l).toContain("Organization/");
829
+ });
830
+ it("offers Patient/ and Group/ for Observation.subject.reference", async ()=>{
831
+ const { cc } = completionAt('{\n "resourceType": "Observation",\n "subject": {\n "reference": "|\n }\n}');
832
+ const result = await source(cc);
833
+ const l = labels(result);
834
+ expect(l).toContain("Patient/");
835
+ expect(l).toContain("Group/");
836
+ });
837
+ });
838
+ describe("contained resource completions", ()=>{
839
+ it("offers resourceType inside contained array item", async ()=>{
840
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "contained": [\n {\n |\n }\n ]\n}');
841
+ const result = await source(cc);
842
+ const l = labels(result);
843
+ expect(l).toContain("resourceType");
844
+ });
845
+ it("offers inner resource fields when contained has resourceType", async ()=>{
846
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "contained": [\n {\n "resourceType": "Observation",\n |\n }\n ]\n}');
847
+ const result = await source(cc);
848
+ const l = labels(result);
849
+ expect(l).toContain("status");
850
+ expect(l).toContain("code");
851
+ expect(l).toContain("subject");
852
+ // Should NOT contain Patient fields
853
+ expect(l).not.toContain("gender");
854
+ expect(l).not.toContain("birthDate");
855
+ });
856
+ it("offers correct reference targets for contained Observation.subject", async ()=>{
857
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "contained": [\n {\n "resourceType": "Observation",\n "subject": {\n "reference": "|\n }\n }\n ]\n}');
858
+ const result = await source(cc);
859
+ const l = labels(result);
860
+ expect(l).toContain("Patient/");
861
+ expect(l).toContain("Group/");
862
+ // Should NOT contain Organization/ (that's from Patient.managingOrganization)
863
+ expect(l).not.toContain("Organization/");
864
+ });
865
+ });
866
+ describe("Bundle.entry.resource completions", ()=>{
867
+ it("offers Observation fields inside entry.resource with explicit Bundle resourceType", async ()=>{
868
+ const { cc } = completionAt('{\n "resourceType": "Bundle",\n "entry": [\n {\n "resource": {\n "resourceType": "Observation",\n |\n }\n }\n ]\n}');
869
+ const result = await source(cc);
870
+ const l = labels(result);
871
+ expect(l).toContain("status");
872
+ expect(l).toContain("code");
873
+ expect(l).toContain("subject");
874
+ expect(l).not.toContain("type");
875
+ });
876
+ it("offers Observation fields when Bundle resourceType comes from hint (URL)", async ()=>{
877
+ const hintSource = jsonCompletionSource(mockGetSDs, "Bundle", mockExpandValueSet);
878
+ const { cc } = completionAt('{\n "entry": [\n {\n "resource": {\n "resourceType": "Observation",\n |\n }\n }\n ]\n}');
879
+ const result = await hintSource(cc);
880
+ const l = labels(result);
881
+ expect(l).toContain("status");
882
+ expect(l).toContain("code");
883
+ expect(l).toContain("subject");
884
+ expect(l).not.toContain("type");
885
+ });
886
+ });
887
+ describe("nested object completions", ()=>{
888
+ it("offers HumanName fields inside name array item", async ()=>{
889
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "name": [\n {\n |\n }\n ]\n}');
890
+ const result = await source(cc);
891
+ const l = labels(result);
892
+ expect(l).toContain("family");
893
+ expect(l).toContain("given");
894
+ });
895
+ it("offers Reference fields inside managingOrganization", async ()=>{
896
+ const { cc } = completionAt('{\n "resourceType": "Patient",\n "managingOrganization": {\n |\n }\n}');
897
+ const result = await source(cc);
898
+ const l = labels(result);
899
+ expect(l).toContain("reference");
900
+ expect(l).toContain("display");
901
+ });
902
+ });
903
+ describe("Parameters completions", ()=>{
904
+ it("offers parameter fields inside parameter array item object", async ()=>{
905
+ const { cc } = completionAt('{\n "resourceType": "Parameters",\n "parameter": [\n {\n |\n }\n ]\n}');
906
+ const result = await source(cc);
907
+ const l = labels(result);
908
+ expect(l).toContain("name");
909
+ expect(l).toContain("valueString");
910
+ expect(l).toContain("valueBoolean");
911
+ expect(l).toContain("resource");
912
+ expect(l).toContain("part");
913
+ });
914
+ it("offers slice names for parameter.name from profile", async ()=>{
915
+ const { cc } = completionAt('{\n "resourceType": "Parameters",\n "meta": {\n "profile": ["http://health-samurai.io/fhir/core/StructureDefinition/fhir-package-install-parameters"]\n },\n "parameter": [\n {\n "name": "|\n }\n ]\n}');
916
+ const result = await source(cc);
917
+ const l = labels(result);
918
+ expect(l).toContain("package");
919
+ expect(l).toContain("registry");
920
+ });
921
+ it("offers parameter snippets in array-item position from profile", async ()=>{
922
+ const { cc } = completionAt('{\n "resourceType": "Parameters",\n "meta": {\n "profile": ["http://health-samurai.io/fhir/core/StructureDefinition/fhir-package-install-parameters"]\n },\n "parameter": [\n |\n ]\n}');
923
+ const result = await source(cc);
924
+ const l = labels(result);
925
+ expect(l).toContain("package");
926
+ expect(l).toContain("registry");
927
+ expect(l).toContain("parameter");
928
+ });
929
+ it("offers generic parameter template without profile", async ()=>{
930
+ const { cc } = completionAt('{\n "resourceType": "Parameters",\n "parameter": [\n |\n ]\n}');
931
+ const result = await source(cc);
932
+ expect(result).not.toBe(null);
933
+ const l = labels(result);
934
+ expect(l).toContain("parameter");
935
+ });
936
+ it("offers parameter fields for second array item", async ()=>{
937
+ const { cc } = completionAt('{\n "resourceType": "Parameters",\n "parameter": [\n {"name": "a", "valueString": "1"},\n {\n |\n }\n ]\n}');
938
+ const result = await source(cc);
939
+ const l = labels(result);
940
+ expect(l).toContain("name");
941
+ expect(l).toContain("valueString");
942
+ expect(l).not.toContain("parameter");
943
+ });
944
+ it("offers slice names for second array item name value", async ()=>{
945
+ const { cc } = completionAt('{\n "resourceType": "AidboxTopicDestination",\n "meta": {\n "profile": ["http://aidbox.app/StructureDefinition/aidboxtopicdestination-kafka-best-effort"]\n },\n "parameter": [\n {"name": "kafkaTopic", "valueString": "1"},\n {\n "name": "|\n }\n ]\n}');
946
+ const result = await source(cc);
947
+ const l = labels(result);
948
+ expect(l).toContain("bootstrapServers");
949
+ expect(l).toContain("batchSize");
950
+ });
951
+ it("offers part fields via contentReference", async ()=>{
952
+ const { cc } = completionAt('{\n "resourceType": "Parameters",\n "parameter": [\n {\n "name": "result",\n "part": [\n {\n |\n }\n ]\n }\n ]\n}');
953
+ const result = await source(cc);
954
+ const l = labels(result);
955
+ expect(l).toContain("name");
956
+ expect(l).toContain("valueString");
957
+ expect(l).toContain("part");
958
+ });
959
+ it("offers typed snippet for profile with value[x] constraint", async ()=>{
960
+ const typedSource = jsonCompletionSource(mockGetSDs, undefined, mockExpandValueSet);
961
+ const { cc } = completionAt('{\n "resourceType": "Parameters",\n "meta": {\n "profile": ["http://example.com/StructureDefinition/typed-params"]\n },\n "parameter": [\n |\n ]\n}');
962
+ const result = await typedSource(cc);
963
+ const l = labels(result);
964
+ expect(l).toContain("count");
965
+ expect(l).toContain("label");
966
+ });
967
+ it("works for Parameters-derived types (AidboxTopicDestination)", async ()=>{
968
+ const { cc } = completionAt('{\n "resourceType": "AidboxTopicDestination",\n "meta": {\n "profile": ["http://aidbox.app/StructureDefinition/aidboxtopicdestination-kafka-best-effort"]\n },\n "parameter": [\n |\n ]\n}');
969
+ const result = await source(cc);
970
+ const l = labels(result);
971
+ expect(l).toContain("kafkaTopic");
972
+ expect(l).toContain("bootstrapServers");
973
+ expect(l).toContain("batchSize");
974
+ });
975
+ it("offers slice names for derived type parameter.name", async ()=>{
976
+ const { cc } = completionAt('{\n "resourceType": "AidboxTopicDestination",\n "meta": {\n "profile": ["http://aidbox.app/StructureDefinition/aidboxtopicdestination-kafka-best-effort"]\n },\n "parameter": [\n {\n "name": "|\n }\n ]\n}');
977
+ const result = await source(cc);
978
+ const l = labels(result);
979
+ expect(l).toContain("kafkaTopic");
980
+ expect(l).toContain("bootstrapServers");
981
+ expect(l).toContain("batchSize");
982
+ });
983
+ it("offers fixed value for profiled field", async ()=>{
984
+ const { cc } = completionAt('{\n "resourceType": "AidboxTopicDestination",\n "meta": {\n "profile": ["http://aidbox.app/StructureDefinition/aidboxtopicdestination-kafka-best-effort"]\n },\n "kind": "|\n}');
985
+ const result = await source(cc);
986
+ const l = labels(result);
987
+ expect(l).toContain("kafka-best-effort");
988
+ });
989
+ it("generic parameter snippet is offered with lowest boost", async ()=>{
990
+ const doc = '{\n "resourceType": "Parameters",\n "parameter": [\n |\n ]\n}';
991
+ const { cc } = completionAt(doc);
992
+ const result = await source(cc);
993
+ const option = result?.options.find((o)=>o.label === "parameter");
994
+ expect(option).toBeDefined();
995
+ expect(option?.boost).toBe(-1);
996
+ expect(option?.info).toBe("Custom parameter");
997
+ });
998
+ });
999
+ describe("HTTP mode", ()=>{
1000
+ it("offers Patient fields in HTTP mode body", async ()=>{
1001
+ const doc = 'POST /fhir/Patient\nContent-Type: application/json\n\n{\n "resourceType": "Patient",\n |\n}';
1002
+ const { cc } = completionAt(doc);
1003
+ const result = await source(cc);
1004
+ const l = labels(result);
1005
+ expect(l).toContain("name");
1006
+ expect(l).toContain("gender");
1007
+ });
1008
+ it("offers gender codes in HTTP mode body", async ()=>{
1009
+ const doc = 'PUT /fhir/Patient/1\n\n{\n "resourceType": "Patient",\n "gender": "|\n}';
1010
+ const { cc } = completionAt(doc);
1011
+ const result = await source(cc);
1012
+ const l = labels(result);
1013
+ expect(l).toContain("male");
1014
+ expect(l).toContain("female");
1015
+ });
1016
+ it("offers Observation fields inside Bundle entry.resource via hint", async ()=>{
1017
+ const hintSource = jsonCompletionSource(mockGetSDs, "Bundle", mockExpandValueSet);
1018
+ const doc = 'POST /fhir/Bundle\nContent-Type: application/json\n\n{\n "entry": [\n {\n "resource": {\n "resourceType": "Observation",\n |\n }\n }\n ]\n}';
1019
+ const { cc } = completionAt(doc);
1020
+ const result = await hintSource(cc);
1021
+ const l = labels(result);
1022
+ expect(l).toContain("status");
1023
+ expect(l).toContain("code");
1024
+ expect(l).toContain("subject");
1025
+ expect(l).not.toContain("type");
1026
+ });
1027
+ });
1028
+ });
1029
+ describe("buildParameterSnippet", ()=>{
1030
+ it("inserts valueString by default when no value types", ()=>{
1031
+ const { text, cursorOffset } = buildParameterSnippet("package", [], " ");
1032
+ expect(text).toContain('"name": "package"');
1033
+ expect(text).toContain('"valueString": ""');
1034
+ // Cursor should be inside the empty valueString quotes
1035
+ expect(text[cursorOffset - 1]).toBe('"');
1036
+ expect(text[cursorOffset]).toBe('"');
1037
+ });
1038
+ it("inserts valueString for string-constrained type", ()=>{
1039
+ const { text } = buildParameterSnippet("label", [
1040
+ "string"
1041
+ ], " ");
1042
+ expect(text).toContain('"name": "label"');
1043
+ expect(text).toContain('"valueString": ""');
1044
+ });
1045
+ it("inserts valueCode for code-constrained type", ()=>{
1046
+ const { text } = buildParameterSnippet("status", [
1047
+ "code"
1048
+ ], " ");
1049
+ expect(text).toContain('"name": "status"');
1050
+ expect(text).toContain('"valueCode": ""');
1051
+ });
1052
+ it("inserts valueInteger for integer-constrained type", ()=>{
1053
+ const { text, cursorOffset } = buildParameterSnippet("count", [
1054
+ "integer"
1055
+ ], " ");
1056
+ expect(text).toContain('"name": "count"');
1057
+ expect(text).toContain('"valueInteger": ');
1058
+ expect(text).not.toContain('"valueString"');
1059
+ // Cursor should be after ": "
1060
+ expect(text.slice(cursorOffset - 2, cursorOffset)).toBe(": ");
1061
+ });
1062
+ it("inserts valueBoolean for boolean-constrained type", ()=>{
1063
+ const { text } = buildParameterSnippet("active", [
1064
+ "boolean"
1065
+ ], " ");
1066
+ expect(text).toContain('"name": "active"');
1067
+ expect(text).toContain('"valueBoolean": ');
1068
+ });
1069
+ it("inserts complex object for CodeableConcept type", ()=>{
1070
+ const { text } = buildParameterSnippet("code", [
1071
+ "CodeableConcept"
1072
+ ], " ");
1073
+ expect(text).toContain('"name": "code"');
1074
+ expect(text).toContain('"valueCodeableConcept": {');
1075
+ expect(text).toContain("}");
1076
+ });
1077
+ it("uses correct indentation", ()=>{
1078
+ const { text } = buildParameterSnippet("test", [], " ");
1079
+ const lines = text.split("\n");
1080
+ // Line 0: {
1081
+ expect(lines[0]).toBe("{");
1082
+ // Line 1: inner indent + "name"
1083
+ expect(lines[1]).toMatch(/^ {4}"name": "test",$/);
1084
+ // Line 2: inner indent + "valueString"
1085
+ expect(lines[2]).toMatch(/^ {4}"valueString": ""$/);
1086
+ // Line 3: outer indent + }
1087
+ expect(lines[3]).toBe(" }");
1088
+ });
1089
+ it("inserts empty name for generic template with cursor in name", ()=>{
1090
+ const { text, cursorOffset } = buildParameterSnippet("", [], " ");
1091
+ expect(text).toContain('"name": ""');
1092
+ expect(text).toContain('"valueString": ""');
1093
+ // Cursor should be inside the name quotes (first ""), not valueString
1094
+ const nameQuoteIdx = text.indexOf('"name": ""') + '"name": "'.length;
1095
+ expect(cursorOffset).toBe(nameQuoteIdx);
1096
+ });
1097
+ });
1098
+
1099
+ //# sourceMappingURL=fhir-autocomplete.test.js.map