fhirpath-ts 0.0.0-bootstrap.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +391 -0
  3. package/THIRD-PARTY-NOTICES.md +296 -0
  4. package/dist/analyzer/analyze-dto.d.ts +45 -0
  5. package/dist/analyzer/analyze-dto.d.ts.map +1 -0
  6. package/dist/analyzer/analyze-dto.js +147 -0
  7. package/dist/analyzer/analyze-dto.js.map +1 -0
  8. package/dist/analyzer/analyze.d.ts +98 -0
  9. package/dist/analyzer/analyze.d.ts.map +1 -0
  10. package/dist/analyzer/analyze.js +925 -0
  11. package/dist/analyzer/analyze.js.map +1 -0
  12. package/dist/analyzer/expression-policy.d.ts +210 -0
  13. package/dist/analyzer/expression-policy.d.ts.map +1 -0
  14. package/dist/analyzer/expression-policy.js +254 -0
  15. package/dist/analyzer/expression-policy.js.map +1 -0
  16. package/dist/analyzer/index.d.ts +3 -0
  17. package/dist/analyzer/index.d.ts.map +1 -0
  18. package/dist/analyzer/index.js +6 -0
  19. package/dist/analyzer/index.js.map +1 -0
  20. package/dist/analyzer/regex-safety.d.ts +10 -0
  21. package/dist/analyzer/regex-safety.d.ts.map +1 -0
  22. package/dist/analyzer/regex-safety.js +84 -0
  23. package/dist/analyzer/regex-safety.js.map +1 -0
  24. package/dist/analyzer/signatures.d.ts +72 -0
  25. package/dist/analyzer/signatures.d.ts.map +1 -0
  26. package/dist/analyzer/signatures.js +195 -0
  27. package/dist/analyzer/signatures.js.map +1 -0
  28. package/dist/api/bundle.d.ts +29 -0
  29. package/dist/api/bundle.d.ts.map +1 -0
  30. package/dist/api/bundle.js +108 -0
  31. package/dist/api/bundle.js.map +1 -0
  32. package/dist/api/cache.d.ts +10 -0
  33. package/dist/api/cache.d.ts.map +1 -0
  34. package/dist/api/cache.js +38 -0
  35. package/dist/api/cache.js.map +1 -0
  36. package/dist/api/column-signature.d.ts +53 -0
  37. package/dist/api/column-signature.d.ts.map +1 -0
  38. package/dist/api/column-signature.js +43 -0
  39. package/dist/api/column-signature.js.map +1 -0
  40. package/dist/api/compile.d.ts +120 -0
  41. package/dist/api/compile.d.ts.map +1 -0
  42. package/dist/api/compile.js +167 -0
  43. package/dist/api/compile.js.map +1 -0
  44. package/dist/api/constraints.d.ts +48 -0
  45. package/dist/api/constraints.d.ts.map +1 -0
  46. package/dist/api/constraints.js +52 -0
  47. package/dist/api/constraints.js.map +1 -0
  48. package/dist/api/dto.d.ts +134 -0
  49. package/dist/api/dto.d.ts.map +1 -0
  50. package/dist/api/dto.js +295 -0
  51. package/dist/api/dto.js.map +1 -0
  52. package/dist/api/engine.d.ts +136 -0
  53. package/dist/api/engine.d.ts.map +1 -0
  54. package/dist/api/engine.js +183 -0
  55. package/dist/api/engine.js.map +1 -0
  56. package/dist/api/evaluate.d.ts +7 -0
  57. package/dist/api/evaluate.d.ts.map +1 -0
  58. package/dist/api/evaluate.js +10 -0
  59. package/dist/api/evaluate.js.map +1 -0
  60. package/dist/api/project.d.ts +89 -0
  61. package/dist/api/project.d.ts.map +1 -0
  62. package/dist/api/project.js +150 -0
  63. package/dist/api/project.js.map +1 -0
  64. package/dist/api/tagged.d.ts +14 -0
  65. package/dist/api/tagged.d.ts.map +1 -0
  66. package/dist/api/tagged.js +13 -0
  67. package/dist/api/tagged.js.map +1 -0
  68. package/dist/cli/dto-check.d.ts +25 -0
  69. package/dist/cli/dto-check.d.ts.map +1 -0
  70. package/dist/cli/dto-check.js +77 -0
  71. package/dist/cli/dto-check.js.map +1 -0
  72. package/dist/cli/fhirpath-check.d.ts +3 -0
  73. package/dist/cli/fhirpath-check.d.ts.map +1 -0
  74. package/dist/cli/fhirpath-check.js +149 -0
  75. package/dist/cli/fhirpath-check.js.map +1 -0
  76. package/dist/cli/ts-loader.d.mts +3 -0
  77. package/dist/cli/ts-loader.d.mts.map +1 -0
  78. package/dist/cli/ts-loader.mjs +48 -0
  79. package/dist/cli/ts-loader.mjs.map +1 -0
  80. package/dist/engine/context.d.ts +173 -0
  81. package/dist/engine/context.d.ts.map +1 -0
  82. package/dist/engine/context.js +118 -0
  83. package/dist/engine/context.js.map +1 -0
  84. package/dist/engine/evaluator.d.ts +7 -0
  85. package/dist/engine/evaluator.d.ts.map +1 -0
  86. package/dist/engine/evaluator.js +196 -0
  87. package/dist/engine/evaluator.js.map +1 -0
  88. package/dist/engine/navigation.d.ts +11 -0
  89. package/dist/engine/navigation.d.ts.map +1 -0
  90. package/dist/engine/navigation.js +102 -0
  91. package/dist/engine/navigation.js.map +1 -0
  92. package/dist/engine/operators/collections.d.ts +12 -0
  93. package/dist/engine/operators/collections.d.ts.map +1 -0
  94. package/dist/engine/operators/collections.js +31 -0
  95. package/dist/engine/operators/collections.js.map +1 -0
  96. package/dist/engine/operators/comparison.d.ts +13 -0
  97. package/dist/engine/operators/comparison.d.ts.map +1 -0
  98. package/dist/engine/operators/comparison.js +77 -0
  99. package/dist/engine/operators/comparison.js.map +1 -0
  100. package/dist/engine/operators/equality.d.ts +19 -0
  101. package/dist/engine/operators/equality.d.ts.map +1 -0
  102. package/dist/engine/operators/equality.js +203 -0
  103. package/dist/engine/operators/equality.js.map +1 -0
  104. package/dist/engine/operators/index.d.ts +18 -0
  105. package/dist/engine/operators/index.d.ts.map +1 -0
  106. package/dist/engine/operators/index.js +30 -0
  107. package/dist/engine/operators/index.js.map +1 -0
  108. package/dist/engine/operators/logic.d.ts +8 -0
  109. package/dist/engine/operators/logic.d.ts.map +1 -0
  110. package/dist/engine/operators/logic.js +38 -0
  111. package/dist/engine/operators/logic.js.map +1 -0
  112. package/dist/engine/operators/math.d.ts +13 -0
  113. package/dist/engine/operators/math.d.ts.map +1 -0
  114. package/dist/engine/operators/math.js +198 -0
  115. package/dist/engine/operators/math.js.map +1 -0
  116. package/dist/engine/operators/strings.d.ts +8 -0
  117. package/dist/engine/operators/strings.d.ts.map +1 -0
  118. package/dist/engine/operators/strings.js +22 -0
  119. package/dist/engine/operators/strings.js.map +1 -0
  120. package/dist/engine/operators/types.d.ts +3 -0
  121. package/dist/engine/operators/types.d.ts.map +1 -0
  122. package/dist/engine/operators/types.js +15 -0
  123. package/dist/engine/operators/types.js.map +1 -0
  124. package/dist/engine/type-matching.d.ts +20 -0
  125. package/dist/engine/type-matching.d.ts.map +1 -0
  126. package/dist/engine/type-matching.js +122 -0
  127. package/dist/engine/type-matching.js.map +1 -0
  128. package/dist/errors.d.ts +25 -0
  129. package/dist/errors.d.ts.map +1 -0
  130. package/dist/errors.js +21 -0
  131. package/dist/errors.js.map +1 -0
  132. package/dist/eslint/index.d.ts +12 -0
  133. package/dist/eslint/index.d.ts.map +1 -0
  134. package/dist/eslint/index.js +316 -0
  135. package/dist/eslint/index.js.map +1 -0
  136. package/dist/fhir/html-checks.d.ts +7 -0
  137. package/dist/fhir/html-checks.d.ts.map +1 -0
  138. package/dist/fhir/html-checks.js +256 -0
  139. package/dist/fhir/html-checks.js.map +1 -0
  140. package/dist/fhir/model-navigation.d.ts +11 -0
  141. package/dist/fhir/model-navigation.d.ts.map +1 -0
  142. package/dist/fhir/model-navigation.js +142 -0
  143. package/dist/fhir/model-navigation.js.map +1 -0
  144. package/dist/functions/aggregate.d.ts +2 -0
  145. package/dist/functions/aggregate.d.ts.map +1 -0
  146. package/dist/functions/aggregate.js +127 -0
  147. package/dist/functions/aggregate.js.map +1 -0
  148. package/dist/functions/boundary.d.ts +2 -0
  149. package/dist/functions/boundary.d.ts.map +1 -0
  150. package/dist/functions/boundary.js +189 -0
  151. package/dist/functions/boundary.js.map +1 -0
  152. package/dist/functions/combining.d.ts +2 -0
  153. package/dist/functions/combining.d.ts.map +1 -0
  154. package/dist/functions/combining.js +13 -0
  155. package/dist/functions/combining.js.map +1 -0
  156. package/dist/functions/control.d.ts +2 -0
  157. package/dist/functions/control.d.ts.map +1 -0
  158. package/dist/functions/control.js +25 -0
  159. package/dist/functions/control.js.map +1 -0
  160. package/dist/functions/conversion.d.ts +3 -0
  161. package/dist/functions/conversion.d.ts.map +1 -0
  162. package/dist/functions/conversion.js +316 -0
  163. package/dist/functions/conversion.js.map +1 -0
  164. package/dist/functions/date-components.d.ts +2 -0
  165. package/dist/functions/date-components.d.ts.map +1 -0
  166. package/dist/functions/date-components.js +81 -0
  167. package/dist/functions/date-components.js.map +1 -0
  168. package/dist/functions/existence.d.ts +4 -0
  169. package/dist/functions/existence.d.ts.map +1 -0
  170. package/dist/functions/existence.js +97 -0
  171. package/dist/functions/existence.js.map +1 -0
  172. package/dist/functions/fhir.d.ts +2 -0
  173. package/dist/functions/fhir.d.ts.map +1 -0
  174. package/dist/functions/fhir.js +222 -0
  175. package/dist/functions/fhir.js.map +1 -0
  176. package/dist/functions/filtering.d.ts +2 -0
  177. package/dist/functions/filtering.d.ts.map +1 -0
  178. package/dist/functions/filtering.js +112 -0
  179. package/dist/functions/filtering.js.map +1 -0
  180. package/dist/functions/install.d.ts +18 -0
  181. package/dist/functions/install.d.ts.map +1 -0
  182. package/dist/functions/install.js +20 -0
  183. package/dist/functions/install.js.map +1 -0
  184. package/dist/functions/iteration.d.ts +7 -0
  185. package/dist/functions/iteration.d.ts.map +1 -0
  186. package/dist/functions/iteration.js +9 -0
  187. package/dist/functions/iteration.js.map +1 -0
  188. package/dist/functions/math.d.ts +2 -0
  189. package/dist/functions/math.d.ts.map +1 -0
  190. package/dist/functions/math.js +152 -0
  191. package/dist/functions/math.js.map +1 -0
  192. package/dist/functions/reflection.d.ts +2 -0
  193. package/dist/functions/reflection.d.ts.map +1 -0
  194. package/dist/functions/reflection.js +23 -0
  195. package/dist/functions/reflection.js.map +1 -0
  196. package/dist/functions/registry.d.ts +28 -0
  197. package/dist/functions/registry.d.ts.map +1 -0
  198. package/dist/functions/registry.js +46 -0
  199. package/dist/functions/registry.js.map +1 -0
  200. package/dist/functions/sort.d.ts +2 -0
  201. package/dist/functions/sort.d.ts.map +1 -0
  202. package/dist/functions/sort.js +48 -0
  203. package/dist/functions/sort.js.map +1 -0
  204. package/dist/functions/string.d.ts +2 -0
  205. package/dist/functions/string.d.ts.map +1 -0
  206. package/dist/functions/string.js +353 -0
  207. package/dist/functions/string.js.map +1 -0
  208. package/dist/functions/subsetting.d.ts +2 -0
  209. package/dist/functions/subsetting.d.ts.map +1 -0
  210. package/dist/functions/subsetting.js +72 -0
  211. package/dist/functions/subsetting.js.map +1 -0
  212. package/dist/functions/tree.d.ts +8 -0
  213. package/dist/functions/tree.d.ts.map +1 -0
  214. package/dist/functions/tree.js +109 -0
  215. package/dist/functions/tree.js.map +1 -0
  216. package/dist/functions/type-specifier.d.ts +8 -0
  217. package/dist/functions/type-specifier.d.ts.map +1 -0
  218. package/dist/functions/type-specifier.js +27 -0
  219. package/dist/functions/type-specifier.js.map +1 -0
  220. package/dist/functions/utility.d.ts +2 -0
  221. package/dist/functions/utility.d.ts.map +1 -0
  222. package/dist/functions/utility.js +76 -0
  223. package/dist/functions/utility.js.map +1 -0
  224. package/dist/functions/variables.d.ts +2 -0
  225. package/dist/functions/variables.d.ts.map +1 -0
  226. package/dist/functions/variables.js +35 -0
  227. package/dist/functions/variables.js.map +1 -0
  228. package/dist/index.d.ts +25 -0
  229. package/dist/index.d.ts.map +1 -0
  230. package/dist/index.js +11 -0
  231. package/dist/index.js.map +1 -0
  232. package/dist/lexer/lexer.d.ts +4 -0
  233. package/dist/lexer/lexer.d.ts.map +1 -0
  234. package/dist/lexer/lexer.js +318 -0
  235. package/dist/lexer/lexer.js.map +1 -0
  236. package/dist/lexer/tokens.d.ts +23 -0
  237. package/dist/lexer/tokens.d.ts.map +1 -0
  238. package/dist/lexer/tokens.js +40 -0
  239. package/dist/lexer/tokens.js.map +1 -0
  240. package/dist/model/provider.d.ts +36 -0
  241. package/dist/model/provider.d.ts.map +1 -0
  242. package/dist/model/provider.js +2 -0
  243. package/dist/model/provider.js.map +1 -0
  244. package/dist/parser/ast.d.ts +104 -0
  245. package/dist/parser/ast.d.ts.map +1 -0
  246. package/dist/parser/ast.js +2 -0
  247. package/dist/parser/ast.js.map +1 -0
  248. package/dist/parser/parser.d.ts +4 -0
  249. package/dist/parser/parser.d.ts.map +1 -0
  250. package/dist/parser/parser.js +299 -0
  251. package/dist/parser/parser.js.map +1 -0
  252. package/dist/parser/precedence.d.ts +24 -0
  253. package/dist/parser/precedence.d.ts.map +1 -0
  254. package/dist/parser/precedence.js +52 -0
  255. package/dist/parser/precedence.js.map +1 -0
  256. package/dist/parser/printer.d.ts +4 -0
  257. package/dist/parser/printer.d.ts.map +1 -0
  258. package/dist/parser/printer.js +112 -0
  259. package/dist/parser/printer.js.map +1 -0
  260. package/dist/r4/generated/resources-data.d.ts +3 -0
  261. package/dist/r4/generated/resources-data.d.ts.map +1 -0
  262. package/dist/r4/generated/resources-data.js +28628 -0
  263. package/dist/r4/generated/resources-data.js.map +1 -0
  264. package/dist/r4/generated/type-maps.d.ts +43153 -0
  265. package/dist/r4/generated/type-maps.d.ts.map +1 -0
  266. package/dist/r4/generated/type-maps.js +4 -0
  267. package/dist/r4/generated/type-maps.js.map +1 -0
  268. package/dist/r4/generated/types-data.d.ts +3 -0
  269. package/dist/r4/generated/types-data.d.ts.map +1 -0
  270. package/dist/r4/generated/types-data.js +2205 -0
  271. package/dist/r4/generated/types-data.js.map +1 -0
  272. package/dist/r4/index.d.ts +9 -0
  273. package/dist/r4/index.d.ts.map +1 -0
  274. package/dist/r4/index.js +94 -0
  275. package/dist/r4/index.js.map +1 -0
  276. package/dist/r4/model-data.d.ts +17 -0
  277. package/dist/r4/model-data.d.ts.map +1 -0
  278. package/dist/r4/model-data.js +2 -0
  279. package/dist/r4/model-data.js.map +1 -0
  280. package/dist/sites/index.d.ts +31 -0
  281. package/dist/sites/index.d.ts.map +1 -0
  282. package/dist/sites/index.js +205 -0
  283. package/dist/sites/index.js.map +1 -0
  284. package/dist/typed/infer.d.ts +234 -0
  285. package/dist/typed/infer.d.ts.map +1 -0
  286. package/dist/typed/infer.js +85 -0
  287. package/dist/typed/infer.js.map +1 -0
  288. package/dist/typed/perf-fixture.types.d.ts +136 -0
  289. package/dist/typed/perf-fixture.types.d.ts.map +1 -0
  290. package/dist/typed/perf-fixture.types.js +2 -0
  291. package/dist/typed/perf-fixture.types.js.map +1 -0
  292. package/dist/values/collection.d.ts +24 -0
  293. package/dist/values/collection.d.ts.map +1 -0
  294. package/dist/values/collection.js +51 -0
  295. package/dist/values/collection.js.map +1 -0
  296. package/dist/values/datetime.d.ts +54 -0
  297. package/dist/values/datetime.d.ts.map +1 -0
  298. package/dist/values/datetime.js +226 -0
  299. package/dist/values/datetime.js.map +1 -0
  300. package/dist/values/decimal.d.ts +48 -0
  301. package/dist/values/decimal.d.ts.map +1 -0
  302. package/dist/values/decimal.js +188 -0
  303. package/dist/values/decimal.js.map +1 -0
  304. package/dist/values/numeric.d.ts +24 -0
  305. package/dist/values/numeric.d.ts.map +1 -0
  306. package/dist/values/numeric.js +53 -0
  307. package/dist/values/numeric.js.map +1 -0
  308. package/dist/values/quantity.d.ts +49 -0
  309. package/dist/values/quantity.d.ts.map +1 -0
  310. package/dist/values/quantity.js +297 -0
  311. package/dist/values/quantity.js.map +1 -0
  312. package/dist/values/temporal-arithmetic.d.ts +17 -0
  313. package/dist/values/temporal-arithmetic.d.ts.map +1 -0
  314. package/dist/values/temporal-arithmetic.js +183 -0
  315. package/dist/values/temporal-arithmetic.js.map +1 -0
  316. package/dist/values/temporal-compare.d.ts +9 -0
  317. package/dist/values/temporal-compare.d.ts.map +1 -0
  318. package/dist/values/temporal-compare.js +59 -0
  319. package/dist/values/temporal-compare.js.map +1 -0
  320. package/dist/values/type-compat.d.ts +47 -0
  321. package/dist/values/type-compat.d.ts.map +1 -0
  322. package/dist/values/type-compat.js +100 -0
  323. package/dist/values/type-compat.js.map +1 -0
  324. package/dist/values/typed-value.d.ts +48 -0
  325. package/dist/values/typed-value.d.ts.map +1 -0
  326. package/dist/values/typed-value.js +117 -0
  327. package/dist/values/typed-value.js.map +1 -0
  328. package/dist/values/ucum.d.ts +14 -0
  329. package/dist/values/ucum.d.ts.map +1 -0
  330. package/dist/values/ucum.js +146 -0
  331. package/dist/values/ucum.js.map +1 -0
  332. package/package.json +137 -0
  333. package/src/analyzer/analyze-dto.ts +195 -0
  334. package/src/analyzer/analyze.ts +1181 -0
  335. package/src/analyzer/expression-policy.ts +434 -0
  336. package/src/analyzer/index.ts +23 -0
  337. package/src/analyzer/regex-safety.ts +85 -0
  338. package/src/analyzer/signatures.ts +260 -0
  339. package/src/api/bundle.ts +132 -0
  340. package/src/api/cache.ts +40 -0
  341. package/src/api/column-signature.ts +71 -0
  342. package/src/api/compile.ts +308 -0
  343. package/src/api/constraints.ts +104 -0
  344. package/src/api/dto.ts +445 -0
  345. package/src/api/engine.ts +328 -0
  346. package/src/api/evaluate.ts +11 -0
  347. package/src/api/project.ts +255 -0
  348. package/src/api/tagged.ts +35 -0
  349. package/src/cli/dto-check.ts +94 -0
  350. package/src/cli/fhirpath-check.ts +168 -0
  351. package/src/cli/ts-loader.mjs +49 -0
  352. package/src/engine/context.ts +282 -0
  353. package/src/engine/evaluator.ts +246 -0
  354. package/src/engine/navigation.ts +106 -0
  355. package/src/engine/operators/collections.ts +34 -0
  356. package/src/engine/operators/comparison.ts +82 -0
  357. package/src/engine/operators/equality.ts +232 -0
  358. package/src/engine/operators/index.ts +65 -0
  359. package/src/engine/operators/logic.ts +53 -0
  360. package/src/engine/operators/math.ts +225 -0
  361. package/src/engine/operators/strings.ts +25 -0
  362. package/src/engine/operators/types.ts +16 -0
  363. package/src/engine/type-matching.ts +148 -0
  364. package/src/errors.ts +33 -0
  365. package/src/eslint/index.ts +388 -0
  366. package/src/fhir/html-checks.ts +266 -0
  367. package/src/fhir/model-navigation.ts +148 -0
  368. package/src/functions/aggregate.ts +136 -0
  369. package/src/functions/boundary.ts +209 -0
  370. package/src/functions/combining.ts +15 -0
  371. package/src/functions/control.ts +25 -0
  372. package/src/functions/conversion.ts +349 -0
  373. package/src/functions/date-components.ts +88 -0
  374. package/src/functions/existence.ts +107 -0
  375. package/src/functions/fhir.ts +247 -0
  376. package/src/functions/filtering.ts +120 -0
  377. package/src/functions/install.ts +19 -0
  378. package/src/functions/iteration.ts +21 -0
  379. package/src/functions/math.ts +167 -0
  380. package/src/functions/reflection.ts +24 -0
  381. package/src/functions/registry.ts +72 -0
  382. package/src/functions/sort.ts +68 -0
  383. package/src/functions/string.ts +413 -0
  384. package/src/functions/subsetting.ts +89 -0
  385. package/src/functions/tree.ts +112 -0
  386. package/src/functions/type-specifier.ts +29 -0
  387. package/src/functions/utility.ts +82 -0
  388. package/src/functions/variables.ts +36 -0
  389. package/src/index.ts +30 -0
  390. package/src/lexer/lexer.ts +341 -0
  391. package/src/lexer/tokens.ts +69 -0
  392. package/src/model/provider.ts +36 -0
  393. package/src/parser/ast.ts +164 -0
  394. package/src/parser/parser.ts +321 -0
  395. package/src/parser/precedence.ts +52 -0
  396. package/src/parser/printer.ts +114 -0
  397. package/src/r4/generated/resources-data.ts +28631 -0
  398. package/src/r4/generated/type-maps.ts +22145 -0
  399. package/src/r4/generated/types-data.ts +2208 -0
  400. package/src/r4/index.ts +107 -0
  401. package/src/r4/model-data.ts +17 -0
  402. package/src/sites/index.ts +285 -0
  403. package/src/typed/infer.ts +433 -0
  404. package/src/typed/perf-fixture.types.ts +143 -0
  405. package/src/values/collection.ts +57 -0
  406. package/src/values/datetime.ts +285 -0
  407. package/src/values/decimal.ts +213 -0
  408. package/src/values/numeric.ts +63 -0
  409. package/src/values/quantity.ts +358 -0
  410. package/src/values/temporal-arithmetic.ts +231 -0
  411. package/src/values/temporal-compare.ts +65 -0
  412. package/src/values/type-compat.ts +133 -0
  413. package/src/values/typed-value.ts +151 -0
  414. package/src/values/ucum.ts +181 -0
@@ -0,0 +1,196 @@
1
+ import "../functions/install.js";
2
+ import { FhirPathRuntimeError, FhirPathTypeError } from "../errors.js";
3
+ import { describeArity, lookupFunction } from "../functions/registry.js";
4
+ import { criteriaBoolean, singleton, wrapBoolean } from "../values/collection.js";
5
+ import { Temporal } from "../values/datetime.js";
6
+ import { Decimal } from "../values/decimal.js";
7
+ import { wrapNumeric } from "../values/numeric.js";
8
+ import { SYSTEM_BOOLEAN, SYSTEM_DATE, SYSTEM_DATETIME, SYSTEM_DECIMAL, SYSTEM_INTEGER, SYSTEM_LONG, SYSTEM_QUANTITY, SYSTEM_STRING, SYSTEM_TIME, toCollection, unwrap, } from "../values/typed-value.js";
9
+ import { forkVariables, resolveEnvironmentVariable, withEnvOverlay, withFrame, } from "./context.js";
10
+ import { navigateIdentifier } from "./navigation.js";
11
+ import { evaluateBinary, evaluateTypeOp, evaluateUnary } from "./operators/index.js";
12
+ import { resolveHostCall } from "./type-matching.js";
13
+ function evaluateArgument(node, context, _input) {
14
+ // Arguments evaluate against $this (the current context item), not the function's
15
+ // input collection: `name.given.combine(name.family)` resolves name.family on the
16
+ // Patient. Lambda-style functions bind their own frame first, so they see each item.
17
+ const forked = forkVariables(context);
18
+ return evaluateNode(node, forked, forked.frame.thisValue);
19
+ }
20
+ /**
21
+ * Calls a host function after focus-type dispatch. Expression functions keep
22
+ * typed values, use the call focus as `$this`, and apply their local environment.
23
+ * Native functions receive eagerly evaluated plain JavaScript values.
24
+ */
25
+ function evaluateHostFunction(name, entry, args, context, input) {
26
+ const host = resolveHostCall(name, entry, context, input);
27
+ if ('ast' in host) {
28
+ if (args.length > 0) {
29
+ throw new FhirPathTypeError(`Function '${name}' expects ${describeArity(0, 0)}, got ${args.length} arguments`);
30
+ }
31
+ if (context.activeExpressionFunctions.has(name)) {
32
+ throw new FhirPathRuntimeError(`Expression-defined function '${name}' calls itself, directly or through another function`);
33
+ }
34
+ context.activeExpressionFunctions.add(name);
35
+ try {
36
+ // Keep the function's environment local and recursion detection active.
37
+ const scoped = host.env === undefined ? context : withEnvOverlay(context, host.env);
38
+ // withFrame rebinds $this to the input and forks variables, so the
39
+ // body's defineVariable() bindings stay local to the body.
40
+ const result = withFrame(scoped, { thisValue: input }, forked => evaluateNode(host.ast, forked, input));
41
+ // Inside the try, so a body that returns several items still removes its
42
+ // name from activeExpressionFunctions on the way out.
43
+ return host.criteria === true ? wrapBoolean(criteriaBoolean(result)) : result;
44
+ }
45
+ finally {
46
+ context.activeExpressionFunctions.delete(name);
47
+ }
48
+ }
49
+ const minArity = host.minArity ?? 0;
50
+ const maxArity = host.maxArity ?? Number.POSITIVE_INFINITY;
51
+ if (args.length < minArity || args.length > maxArity) {
52
+ throw new FhirPathTypeError(`Function '${name}' expects ${describeArity(minArity, maxArity)}, got ${args.length} arguments`);
53
+ }
54
+ const argValues = args.map(node => evaluateArgument(node, context, input).map(unwrap));
55
+ return toCollection(host.fn(input.map(unwrap), ...argValues));
56
+ }
57
+ /** Evaluate one AST node against an input collection. */
58
+ export function evaluateNode(node, context, input) {
59
+ switch (node.kind) {
60
+ case 'null':
61
+ return [];
62
+ case 'boolean':
63
+ return [{ type: SYSTEM_BOOLEAN, value: node.value }];
64
+ case 'string':
65
+ return [{ type: SYSTEM_STRING, value: node.value }];
66
+ case 'number':
67
+ return [
68
+ node.isLong === true
69
+ ? { type: SYSTEM_LONG, value: BigInt(node.text) }
70
+ : evaluateNumberLiteral(node.text, node.isDecimal),
71
+ ];
72
+ case 'date':
73
+ return [{ type: SYSTEM_DATE, value: parseTemporalLiteral('date', node.text) }];
74
+ case 'dateTime':
75
+ return [{ type: SYSTEM_DATETIME, value: parseTemporalLiteral('dateTime', node.text) }];
76
+ case 'time':
77
+ return [{ type: SYSTEM_TIME, value: parseTemporalLiteral('time', node.text) }];
78
+ case 'quantity':
79
+ return [evaluateQuantityLiteral(node.value, node.unit, node.unitKind)];
80
+ case 'identifier':
81
+ return navigateIdentifier(context, node.name, input);
82
+ case 'special':
83
+ return evaluateSpecialVariable(node.name, context);
84
+ case 'external':
85
+ return resolveEnvironmentVariable(context, node.name);
86
+ case 'dot':
87
+ return evaluateNode(node.right, context, evaluateNode(node.left, context, input));
88
+ case 'indexer':
89
+ return evaluateIndexer(node.target, node.index, context, input);
90
+ case 'call': {
91
+ const host = context.functions.get(node.name);
92
+ if (host !== undefined) {
93
+ return evaluateHostFunction(node.name, host, node.args, context, input);
94
+ }
95
+ // Each function argument evaluates in its own defineVariable() scope.
96
+ return lookupFunction(node.name, node.args.length).evaluate(context, input, node.args, evaluateArgument);
97
+ }
98
+ case 'unary':
99
+ return evaluateUnary(context, node.operator, evaluateNode(node.operand, context, input));
100
+ case 'binary':
101
+ // Operator operands are separate chains; variables defined in one are not
102
+ // visible in the other (locked by the official defineVariable tests).
103
+ return evaluateBinary(context, node.operator, evaluateNode(node.left, forkVariables(context), input), evaluateNode(node.right, forkVariables(context), input));
104
+ case 'typeOp':
105
+ return evaluateTypeOp(context, node.operator, evaluateNode(node.operand, context, input), node.type);
106
+ /* v8 ignore start -- exhaustive fallback, unreachable for real ASTs */
107
+ default: {
108
+ const unreachable = node;
109
+ throw new FhirPathRuntimeError(`Unhandled node ${String(unreachable)}`);
110
+ }
111
+ /* v8 ignore stop */
112
+ }
113
+ }
114
+ function evaluateNumberLiteral(text, isDecimal) {
115
+ if (isDecimal) {
116
+ return { type: SYSTEM_DECIMAL, value: parseDecimalLiteral(text) };
117
+ }
118
+ // The grammar's NUMBER rule has no digit-count limit, so an integer literal can
119
+ // exceed 32 bits (or even 64). Widen through wrapNumeric the same way arithmetic
120
+ // results do, rather than truncating through a JS double (Number.parseInt loses
121
+ // precision above 2^53 and never reports the overflow).
122
+ return wrapNumeric(parseDecimalLiteral(text), 'Integer');
123
+ }
124
+ function parseDecimalLiteral(text) {
125
+ const parsed = Decimal.fromString(text);
126
+ /* v8 ignore next 3 -- the lexer only emits parseable decimal literals */
127
+ if (parsed === undefined) {
128
+ throw new FhirPathRuntimeError(`Invalid decimal literal ${text}`);
129
+ }
130
+ return parsed;
131
+ }
132
+ function parseTemporalLiteral(kind, text) {
133
+ const parsed = kind === 'date'
134
+ ? Temporal.parseDate(text)
135
+ : kind === 'dateTime'
136
+ ? Temporal.parseDateTime(text)
137
+ : Temporal.parseTime(text);
138
+ if (!parsed) {
139
+ throw new FhirPathRuntimeError(`Invalid ${kind} literal @${kind === 'time' ? 'T' : ''}${text}`);
140
+ }
141
+ return parsed;
142
+ }
143
+ function evaluateQuantityLiteral(value, unit, unitKind) {
144
+ return {
145
+ type: SYSTEM_QUANTITY,
146
+ value: {
147
+ value: parseDecimalLiteral(value),
148
+ unit,
149
+ calendar: unitKind === 'calendar',
150
+ },
151
+ };
152
+ }
153
+ function evaluateSpecialVariable(name, context) {
154
+ const frame = context.frame;
155
+ switch (name) {
156
+ case 'this':
157
+ return frame.thisValue;
158
+ case 'index': {
159
+ let current = frame;
160
+ while (current && current.index === undefined) {
161
+ current = current.parent;
162
+ }
163
+ if (!current || current.index === undefined) {
164
+ throw new FhirPathTypeError('$index is only defined inside iteration functions');
165
+ }
166
+ return [{ type: SYSTEM_INTEGER, value: current.index }];
167
+ }
168
+ case 'total': {
169
+ let current = frame;
170
+ while (current && current.total === undefined) {
171
+ current = current.parent;
172
+ }
173
+ if (!current || current.total === undefined) {
174
+ throw new FhirPathTypeError('$total is only defined inside aggregate()');
175
+ }
176
+ return current.total;
177
+ }
178
+ /* v8 ignore start -- the parser only produces the three names above */
179
+ default:
180
+ return [];
181
+ /* v8 ignore stop */
182
+ }
183
+ }
184
+ function evaluateIndexer(target, indexNode, context, input) {
185
+ const collection = evaluateNode(target, context, input);
186
+ const index = singleton(evaluateNode(indexNode, context, input), SYSTEM_INTEGER);
187
+ if (index === undefined) {
188
+ return [];
189
+ }
190
+ // The singleton check already guarantees an Integer, and out-of-range (including
191
+ // negative) array access yields undefined, which is the spec's empty result.
192
+ const item = collection[index.value];
193
+ /* v8 ignore next -- both halves run across the suites; v8 misattributes this line */
194
+ return item === undefined ? [] : [item];
195
+ }
196
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/engine/evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type TypedValue } from '../values/typed-value.ts';
2
+ import type { EvaluationContext } from './context.ts';
3
+ /**
4
+ * Evaluate a bare identifier against the input. The spec's root rule (§10.1) applies
5
+ * first: an identifier naming the item's own type yields the item itself, which is
6
+ * how `Patient.name` works when the context is a Patient.
7
+ */
8
+ export declare function navigateIdentifier(context: EvaluationContext, name: string, input: TypedValue[]): TypedValue[];
9
+ /** Read one child element from a complex value, flattening arrays. Missing → empty. */
10
+ export declare function getProperty(item: TypedValue, name: string): TypedValue[];
11
+ //# sourceMappingURL=navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/engine/navigation.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAoC9G;AAwCD,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAkBxE"}
@@ -0,0 +1,102 @@
1
+ import { FhirPathTypeError } from "../errors.js";
2
+ import { readModelProperty } from "../fhir/model-navigation.js";
3
+ import { OBJECT_TYPE, toTypedValue } from "../values/typed-value.js";
4
+ /**
5
+ * Evaluate a bare identifier against the input. The spec's root rule (§10.1) applies
6
+ * first: an identifier naming the item's own type yields the item itself, which is
7
+ * how `Patient.name` works when the context is a Patient.
8
+ */
9
+ export function navigateIdentifier(context, name, input) {
10
+ const results = [];
11
+ for (const item of input) {
12
+ if (matchesTypeName(context, item, name)) {
13
+ results.push(item);
14
+ }
15
+ else if (context.model && item.type.startsWith(`${context.model.namespace}.`)) {
16
+ const modelRead = readModelProperty(context.model, item, name);
17
+ if (modelRead === undefined) {
18
+ // Choice elements go by stem name; a suffixed key like Observation.valueQuantity
19
+ // is the one unknown-element shape the official suites require to error at
20
+ // runtime. Everything else is the static analyzer's job (spec §11) — plain
21
+ // unknown elements navigate to empty, and types the model has never heard of
22
+ // (custom resourceTypes) read like raw JSON.
23
+ // See: https://hl7.org/fhirpath/en/index.html#type-safety-and-strict-evaluation
24
+ if (isChoiceKeyMisuse(context, item.type, name)) {
25
+ throw new FhirPathTypeError(`Element '${name}' is not defined on ${item.type}; choice elements use their stem name`);
26
+ }
27
+ if (name === 'resourceType' ||
28
+ (context.model.listElements !== undefined && context.model.listElements(item.type) === undefined)) {
29
+ results.push(...getProperty(item, name));
30
+ }
31
+ }
32
+ else {
33
+ results.push(...modelRead);
34
+ }
35
+ }
36
+ else if (context.model) {
37
+ const modelRead = readModelProperty(context.model, item, name);
38
+ results.push(...(modelRead ?? getProperty(item, name)));
39
+ }
40
+ else {
41
+ results.push(...getProperty(item, name));
42
+ }
43
+ }
44
+ return results;
45
+ }
46
+ /** True for `valueQuantity`-style keys whose stem is a choice element of the type. */
47
+ function isChoiceKeyMisuse(context, type, name) {
48
+ const model = context.model;
49
+ for (let position = 1; position < name.length; position++) {
50
+ if (!/[A-Z]/.test(name[position])) {
51
+ continue;
52
+ }
53
+ const stem = name.slice(0, position);
54
+ if (model.getElement(type, stem)?.isChoice === true) {
55
+ return true;
56
+ }
57
+ }
58
+ return false;
59
+ }
60
+ function matchesTypeName(context, item, name) {
61
+ // Only the namespace strips off: the backbone type FHIR.ValueSet.expansion.contains
62
+ // must not answer to the element name 'contains'. Lowercase primitive type names
63
+ // (FHIR.code) never self-match either — `children().code` means the element.
64
+ if (!/^[A-Z]/.test(name)) {
65
+ // Lowercase names are always elements: `children().code` never filters by the
66
+ // primitive type FHIR.code.
67
+ return false;
68
+ }
69
+ const separator = item.type.indexOf('.');
70
+ const local = separator === -1 ? item.type : item.type.slice(separator + 1);
71
+ if (local === name && item.type !== OBJECT_TYPE) {
72
+ return true;
73
+ }
74
+ if (context.model) {
75
+ const canonical = context.model.resolveType(name);
76
+ if (canonical !== undefined) {
77
+ return context.model.isSubtypeOf(item.type, canonical);
78
+ }
79
+ }
80
+ return false;
81
+ }
82
+ /** Read one child element from a complex value, flattening arrays. Missing → empty. */
83
+ export function getProperty(item, name) {
84
+ const value = item.value;
85
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
86
+ return [];
87
+ }
88
+ // Own properties only: `Patient.constructor` or `x.toString` must be empty, not
89
+ // an inherited member leaking off Object.prototype.
90
+ if (!Object.hasOwn(value, name)) {
91
+ return [];
92
+ }
93
+ const child = value[name];
94
+ if (child === undefined || child === null) {
95
+ return [];
96
+ }
97
+ if (Array.isArray(child)) {
98
+ return child.filter(element => element !== null && element !== undefined).map(element => toTypedValue(element));
99
+ }
100
+ return [toTypedValue(child)];
101
+ }
102
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/engine/navigation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type TypedValue } from '../../values/typed-value.ts';
2
+ /** Merge with duplicate elimination using `=` semantics (spec §6.4.1 / `union()`). */
3
+ export declare function unionCollections(left: TypedValue[], right: TypedValue[]): TypedValue[];
4
+ /** `in`: left singleton membership; empty left → empty, empty right → false. */
5
+ declare function inOperator(_context: unknown, left: TypedValue[], right: TypedValue[]): TypedValue[];
6
+ export declare const collectionOperators: {
7
+ '|': (_context: import("../context.ts").EvaluationContext, left: TypedValue[], right: TypedValue[]) => TypedValue[];
8
+ in: typeof inOperator;
9
+ contains: (context: import("../context.ts").EvaluationContext, left: TypedValue[], right: TypedValue[]) => TypedValue[];
10
+ };
11
+ export {};
12
+ //# sourceMappingURL=collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../../src/engine/operators/collections.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAI7E,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAQtF;AAED,gFAAgF;AAChF,iBAAS,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAU5F;AAED,eAAO,MAAM,mBAAmB;;;;CAID,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { FhirPathRuntimeError } from "../../errors.js";
2
+ import { SYSTEM_BOOLEAN } from "../../values/typed-value.js";
3
+ import { pairEquals } from "./equality.js";
4
+ /** Merge with duplicate elimination using `=` semantics (spec §6.4.1 / `union()`). */
5
+ export function unionCollections(left, right) {
6
+ const result = [];
7
+ for (const item of [...left, ...right]) {
8
+ if (!result.some(existing => pairEquals(existing, item) === true)) {
9
+ result.push(item);
10
+ }
11
+ }
12
+ return result;
13
+ }
14
+ /** `in`: left singleton membership; empty left → empty, empty right → false. */
15
+ function inOperator(_context, left, right) {
16
+ if (left.length === 0) {
17
+ return [];
18
+ }
19
+ if (left.length > 1) {
20
+ throw new FhirPathRuntimeError("The left operand of 'in' must have at most one item");
21
+ }
22
+ const item = left[0];
23
+ const found = right.some(candidate => pairEquals(item, candidate) === true);
24
+ return [{ type: SYSTEM_BOOLEAN, value: found }];
25
+ }
26
+ export const collectionOperators = {
27
+ '|': (_context, left, right) => unionCollections(left, right),
28
+ in: inOperator,
29
+ contains: (context, left, right) => inOperator(context, right, left),
30
+ };
31
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../../src/engine/operators/collections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAmB,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,IAAkB,EAAE,KAAmB;IACtE,MAAM,MAAM,GAAiB,EAAE,CAAA;IAC/B,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,gFAAgF;AAChF,SAAS,UAAU,CAAC,QAAiB,EAAE,IAAkB,EAAE,KAAmB;IAC5E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,oBAAoB,CAAC,qDAAqD,CAAC,CAAA;IACvF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAe,CAAA;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC,CAAA;IAC3E,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;IAC7D,EAAE,EAAE,UAAU;IACd,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;CACvC,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { type TypedValue } from '../../values/typed-value.ts';
2
+ /**
3
+ * Order two singleton values (spec §6.2). Undefined means empty: an empty operand,
4
+ * a date/time precision mismatch, or units that cannot be compared.
5
+ */
6
+ export declare function compareValues(a: TypedValue, b: TypedValue): number | undefined;
7
+ export declare const comparisonOperators: {
8
+ '<': (_context: unknown, left: TypedValue[], right: TypedValue[]) => TypedValue[];
9
+ '>': (_context: unknown, left: TypedValue[], right: TypedValue[]) => TypedValue[];
10
+ '<=': (_context: unknown, left: TypedValue[], right: TypedValue[]) => TypedValue[];
11
+ '>=': (_context: unknown, left: TypedValue[], right: TypedValue[]) => TypedValue[];
12
+ };
13
+ //# sourceMappingURL=comparison.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.d.ts","sourceRoot":"","sources":["../../../src/engine/operators/comparison.ts"],"names":[],"mappings":"AAMA,OAAO,EAA+C,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAK1G;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CA6B9E;AAgCD,eAAO,MAAM,mBAAmB;oBA7BZ,OAAO,QAAQ,UAAU,EAAE,SAAS,UAAU,EAAE,KAAG,UAAU,EAAE;oBAA/D,OAAO,QAAQ,UAAU,EAAE,SAAS,UAAU,EAAE,KAAG,UAAU,EAAE;qBAA/D,OAAO,QAAQ,UAAU,EAAE,SAAS,UAAU,EAAE,KAAG,UAAU,EAAE;qBAA/D,OAAO,QAAQ,UAAU,EAAE,SAAS,UAAU,EAAE,KAAG,UAAU,EAAE;CAkCpD,CAAA"}
@@ -0,0 +1,77 @@
1
+ import { FhirPathTypeError } from "../../errors.js";
2
+ import { singleton } from "../../values/collection.js";
3
+ import { Temporal } from "../../values/datetime.js";
4
+ import { asNumeric } from "../../values/numeric.js";
5
+ import { coerceQuantityPair, compareQuantities } from "../../values/quantity.js";
6
+ import { compareTemporal } from "../../values/temporal-compare.js";
7
+ import { SYSTEM_BOOLEAN, SYSTEM_STRING, systemTypeOf } from "../../values/typed-value.js";
8
+ /**
9
+ * Order two singleton values (spec §6.2). Undefined means empty: an empty operand,
10
+ * a date/time precision mismatch, or units that cannot be compared.
11
+ */
12
+ export function compareValues(a, b) {
13
+ const numericA = asNumeric(a);
14
+ const numericB = asNumeric(b);
15
+ if (numericA && numericB) {
16
+ return numericA.value.compare(numericB.value);
17
+ }
18
+ if (systemTypeOf(a) === SYSTEM_STRING && systemTypeOf(b) === SYSTEM_STRING) {
19
+ const left = a.value;
20
+ const right = b.value;
21
+ if (left < right) {
22
+ return -1;
23
+ }
24
+ return left > right ? 1 : 0;
25
+ }
26
+ if (a.value instanceof Temporal && b.value instanceof Temporal) {
27
+ const comparison = compareTemporal(a.value, b.value);
28
+ if (comparison === 'differentPrecision') {
29
+ return undefined;
30
+ }
31
+ if (comparison === 'incompatible') {
32
+ throw new FhirPathTypeError('Cannot compare a time with a date or dateTime');
33
+ }
34
+ return comparison;
35
+ }
36
+ const quantityPair = coerceQuantityPair(a, b);
37
+ if (quantityPair) {
38
+ return compareQuantities(quantityPair[0], quantityPair[1]);
39
+ }
40
+ throw new FhirPathTypeError(`Cannot compare ${a.type} with ${b.type}`);
41
+ }
42
+ function comparisonOperator(operator) {
43
+ return (_context, left, right) => {
44
+ const a = singleton(left);
45
+ const b = singleton(right);
46
+ if (a === undefined || b === undefined) {
47
+ return [];
48
+ }
49
+ const comparison = compareValues(a, b);
50
+ if (comparison === undefined) {
51
+ return [];
52
+ }
53
+ let value;
54
+ switch (operator) {
55
+ case '<':
56
+ value = comparison < 0;
57
+ break;
58
+ case '>':
59
+ value = comparison > 0;
60
+ break;
61
+ case '<=':
62
+ value = comparison <= 0;
63
+ break;
64
+ default:
65
+ value = comparison >= 0;
66
+ break;
67
+ }
68
+ return [{ type: SYSTEM_BOOLEAN, value }];
69
+ };
70
+ }
71
+ export const comparisonOperators = {
72
+ '<': comparisonOperator('<'),
73
+ '>': comparisonOperator('>'),
74
+ '<=': comparisonOperator('<='),
75
+ '>=': comparisonOperator('>='),
76
+ };
77
+ //# sourceMappingURL=comparison.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.js","sourceRoot":"","sources":["../../../src/engine/operators/comparison.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type TypedValue } from '../../values/typed-value.ts';
2
+ /**
3
+ * Single-item `=` semantics (spec §6.1.1). Undefined means empty: date/time values
4
+ * whose precisions differ, or quantities whose units cannot be compared yet.
5
+ */
6
+ export declare function pairEquals(a: TypedValue, b: TypedValue): boolean | undefined;
7
+ /** Single-item `~` semantics (spec §6.1.3). Never empty. */
8
+ export declare function pairEquivalent(a: TypedValue, b: TypedValue): boolean;
9
+ /** Collection `=`: empty operand → empty; different lengths → false; ordered pairwise. */
10
+ export declare function collectionEquals(left: TypedValue[], right: TypedValue[]): boolean | undefined;
11
+ /** Collection `~`: both empty → true; order-independent multiset matching. */
12
+ export declare function collectionEquivalent(left: TypedValue[], right: TypedValue[]): boolean;
13
+ export declare const equalityOperators: {
14
+ '=': (_context: import("../context.ts").EvaluationContext, left: TypedValue[], right: TypedValue[]) => TypedValue[];
15
+ '!=': (_context: import("../context.ts").EvaluationContext, left: TypedValue[], right: TypedValue[]) => TypedValue[];
16
+ '~': (_context: import("../context.ts").EvaluationContext, left: TypedValue[], right: TypedValue[]) => TypedValue[];
17
+ '!~': (_context: import("../context.ts").EvaluationContext, left: TypedValue[], right: TypedValue[]) => TypedValue[];
18
+ };
19
+ //# sourceMappingURL=equality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equality.d.ts","sourceRoot":"","sources":["../../../src/engine/operators/equality.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,UAAU,EAEhB,MAAM,6BAA6B,CAAA;AAGpC;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAgC5E;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAyCpE;AAkFD,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,GAAG,SAAS,CAgB7F;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAsBrF;AAMD,eAAO,MAAM,iBAAiB;;;;;CAQC,CAAA"}