fhirpath-ts 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +50 -18
  2. package/dist/analyzer/analyze-dto.d.ts +4 -0
  3. package/dist/analyzer/analyze-dto.d.ts.map +1 -1
  4. package/dist/analyzer/analyze-dto.js +12 -14
  5. package/dist/analyzer/analyze-dto.js.map +1 -1
  6. package/dist/analyzer/analyze.d.ts +22 -6
  7. package/dist/analyzer/analyze.d.ts.map +1 -1
  8. package/dist/analyzer/analyze.js +242 -98
  9. package/dist/analyzer/analyze.js.map +1 -1
  10. package/dist/analyzer/declarations.d.ts +26 -0
  11. package/dist/analyzer/declarations.d.ts.map +1 -0
  12. package/dist/analyzer/declarations.js +68 -0
  13. package/dist/analyzer/declarations.js.map +1 -0
  14. package/dist/analyzer/operator-rules.d.ts +127 -0
  15. package/dist/analyzer/operator-rules.d.ts.map +1 -0
  16. package/dist/analyzer/operator-rules.js +70 -0
  17. package/dist/analyzer/operator-rules.js.map +1 -0
  18. package/dist/analyzer/signatures.d.ts +1097 -10
  19. package/dist/analyzer/signatures.d.ts.map +1 -1
  20. package/dist/analyzer/signatures.js +70 -29
  21. package/dist/analyzer/signatures.js.map +1 -1
  22. package/dist/api/compile.d.ts +32 -8
  23. package/dist/api/compile.d.ts.map +1 -1
  24. package/dist/api/compile.js +2 -0
  25. package/dist/api/compile.js.map +1 -1
  26. package/dist/api/engine.d.ts +42 -16
  27. package/dist/api/engine.d.ts.map +1 -1
  28. package/dist/api/engine.js +2 -1
  29. package/dist/api/engine.js.map +1 -1
  30. package/dist/api/project.d.ts +8 -8
  31. package/dist/api/project.d.ts.map +1 -1
  32. package/dist/api/project.js +31 -19
  33. package/dist/api/project.js.map +1 -1
  34. package/dist/api/strict.d.ts +6 -0
  35. package/dist/api/strict.d.ts.map +1 -0
  36. package/dist/api/strict.js +71 -0
  37. package/dist/api/strict.js.map +1 -0
  38. package/dist/api/tagged.d.ts +4 -4
  39. package/dist/api/tagged.d.ts.map +1 -1
  40. package/dist/api/tagged.js.map +1 -1
  41. package/dist/cli/dto-check.js +7 -3
  42. package/dist/cli/dto-check.js.map +1 -1
  43. package/dist/engine/context.d.ts +3 -1
  44. package/dist/engine/context.d.ts.map +1 -1
  45. package/dist/engine/context.js +5 -1
  46. package/dist/engine/context.js.map +1 -1
  47. package/dist/engine/navigation.d.ts.map +1 -1
  48. package/dist/engine/navigation.js +7 -48
  49. package/dist/engine/navigation.js.map +1 -1
  50. package/dist/engine/type-matching.d.ts.map +1 -1
  51. package/dist/engine/type-matching.js +6 -16
  52. package/dist/engine/type-matching.js.map +1 -1
  53. package/dist/index.d.ts +4 -3
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/parser/parser.d.ts.map +1 -1
  57. package/dist/parser/parser.js +102 -73
  58. package/dist/parser/parser.js.map +1 -1
  59. package/dist/parser/precedence.d.ts +368 -4
  60. package/dist/parser/precedence.d.ts.map +1 -1
  61. package/dist/parser/precedence.js +146 -32
  62. package/dist/parser/precedence.js.map +1 -1
  63. package/dist/r4/generated/resources-data.d.ts +6 -2
  64. package/dist/r4/generated/resources-data.d.ts.map +1 -1
  65. package/dist/r4/generated/resources-data.js +626 -28627
  66. package/dist/r4/generated/resources-data.js.map +1 -1
  67. package/dist/r4/generated/type-maps.d.ts +1367 -0
  68. package/dist/r4/generated/type-maps.d.ts.map +1 -1
  69. package/dist/r4/generated/types-data.d.ts +6 -2
  70. package/dist/r4/generated/types-data.d.ts.map +1 -1
  71. package/dist/r4/generated/types-data.js +84 -2204
  72. package/dist/r4/generated/types-data.js.map +1 -1
  73. package/dist/r4/index.d.ts +3 -1
  74. package/dist/r4/index.d.ts.map +1 -1
  75. package/dist/r4/index.js +10 -4
  76. package/dist/r4/index.js.map +1 -1
  77. package/dist/r4/model-data.d.ts +17 -0
  78. package/dist/r4/model-data.d.ts.map +1 -1
  79. package/dist/r4/model-data.js +118 -1
  80. package/dist/r4/model-data.js.map +1 -1
  81. package/dist/typed/context-maps.d.ts +23 -0
  82. package/dist/typed/context-maps.d.ts.map +1 -0
  83. package/dist/typed/context-maps.js +2 -0
  84. package/dist/typed/context-maps.js.map +1 -0
  85. package/dist/typed/infer.d.ts +99 -229
  86. package/dist/typed/infer.d.ts.map +1 -1
  87. package/dist/typed/infer.js +1 -84
  88. package/dist/typed/infer.js.map +1 -1
  89. package/dist/typed/inference-limits.d.ts +7 -0
  90. package/dist/typed/inference-limits.d.ts.map +1 -0
  91. package/dist/typed/inference-limits.js +6 -0
  92. package/dist/typed/inference-limits.js.map +1 -0
  93. package/dist/typed/metadata-compact.d.ts +189 -0
  94. package/dist/typed/metadata-compact.d.ts.map +1 -0
  95. package/dist/typed/metadata-compact.js +3 -0
  96. package/dist/typed/metadata-compact.js.map +1 -0
  97. package/dist/typed/parser.d.ts +515 -0
  98. package/dist/typed/parser.d.ts.map +1 -0
  99. package/dist/typed/parser.js +2 -0
  100. package/dist/typed/parser.js.map +1 -0
  101. package/dist/values/type-compat.d.ts +8 -0
  102. package/dist/values/type-compat.d.ts.map +1 -1
  103. package/dist/values/type-compat.js +44 -1
  104. package/dist/values/type-compat.js.map +1 -1
  105. package/package.json +20 -1
  106. package/src/analyzer/analyze-dto.ts +21 -17
  107. package/src/analyzer/analyze.ts +335 -109
  108. package/src/analyzer/declarations.ts +120 -0
  109. package/src/analyzer/operator-rules.ts +88 -0
  110. package/src/analyzer/signatures.ts +99 -41
  111. package/src/api/compile.ts +66 -11
  112. package/src/api/engine.ts +97 -33
  113. package/src/api/project.ts +54 -30
  114. package/src/api/strict.ts +112 -0
  115. package/src/api/tagged.ts +5 -5
  116. package/src/cli/dto-check.ts +7 -3
  117. package/src/engine/context.ts +7 -2
  118. package/src/engine/navigation.ts +7 -52
  119. package/src/engine/type-matching.ts +11 -17
  120. package/src/index.ts +25 -2
  121. package/src/parser/parser.ts +106 -74
  122. package/src/parser/precedence.ts +250 -33
  123. package/src/r4/generated/resources-data.ts +624 -28628
  124. package/src/r4/generated/type-maps.ts +1557 -0
  125. package/src/r4/generated/types-data.ts +82 -2205
  126. package/src/r4/index.ts +11 -5
  127. package/src/r4/model-data.ts +127 -0
  128. package/src/typed/context-maps.ts +41 -0
  129. package/src/typed/infer.ts +157 -425
  130. package/src/typed/inference-limits.ts +9 -0
  131. package/src/typed/metadata-compact.ts +307 -0
  132. package/src/typed/parser.ts +2277 -0
  133. package/src/values/type-compat.ts +48 -1
  134. package/dist/typed/perf-fixture.types.d.ts +0 -136
  135. package/dist/typed/perf-fixture.types.d.ts.map +0 -1
  136. package/dist/typed/perf-fixture.types.js +0 -2
  137. package/dist/typed/perf-fixture.types.js.map +0 -1
  138. package/src/typed/perf-fixture.types.ts +0 -143
package/README.md CHANGED
@@ -10,7 +10,7 @@ development. It has zero runtime dependencies and includes:
10
10
  - [Medplum](https://www.medplum.com/) compatibility;
11
11
  - currently focused in FHIR R4, the most commonly used FHIR version.
12
12
 
13
- Check the [playground demo](demo/README.md) or keep reading!
13
+ Check the [playground demo](https://vintasoftware.github.io/fhirpath-ts/) or keep reading!
14
14
 
15
15
  ## Quick start
16
16
 
@@ -38,8 +38,16 @@ engine when you need different defaults:
38
38
  import { FhirPathEngine } from 'fhirpath-ts'
39
39
  import { r4Model } from 'fhirpath-ts/r4'
40
40
 
41
- const fp = new FhirPathEngine({ model: r4Model, env: { threshold: 5 } })
42
- fp.evaluate('%threshold + 1') // [6]
41
+ const fp = new FhirPathEngine({
42
+ model: r4Model,
43
+ env: { threshold: 5 },
44
+ })
45
+ fp.evaluate('%threshold + 1') // number[]; [6]
46
+ ```
47
+
48
+ ```ts-invalid
49
+ const strict = new FhirPathEngine({ model: r4Model, strict: true })
50
+ strict.evaluate('Patient.name.givenn', patient) // throws FhirPathTypeError
43
51
  ```
44
52
 
45
53
  See [API reference](docs/api.md) for all entry points, options, custom functions,
@@ -102,10 +110,14 @@ fp.first('Condition.code.displayText()', condition)
102
110
 
103
111
  This is useful for shared application vocabulary such as `displayText()` or `isFinal()`.
104
112
 
113
+ Name DTO modules `*.dto.ts` and export the classes: `fhirpath-check` imports
114
+ modules matching `**/*.dto.ts` by default and checks each DTO against its
115
+ engine. See [DTO discovery](docs/static-checking.md#dto-discovery).
116
+
105
117
  ## Usage recipes
106
118
 
107
119
  These short examples show the main application APIs. The
108
- [playground demo](demo/README.md) is the best place to explore expressions
120
+ [playground demo](https://vintasoftware.github.io/fhirpath-ts/) is the best place to explore expressions
109
121
  interactively. A test runs every static expression in this section and checks it
110
122
  with the analyzer.
111
123
 
@@ -201,12 +213,14 @@ r4.project(
201
213
  {
202
214
  resultDate: {
203
215
  path: '(%report.effective.ofType(dateTime) | %report.issued).first()',
204
- type: 'string',
205
216
  default: null,
206
217
  },
207
218
  hasResult: { test: '%report.exists()' },
208
219
  },
209
- { env: { reports }, vars: { report: '%reports.where(orderId = %context.id).report' } },
220
+ {
221
+ env: { reports },
222
+ vars: { report: '%reports.where(orderId = %context.id).report' },
223
+ },
210
224
  )
211
225
  ```
212
226
 
@@ -251,9 +265,14 @@ r4.evaluate("Patient.name.trace('names').given", patient, {
251
265
  - FHIRPath always evaluates collections. Use `first()` when application code
252
266
  expects one optional value.
253
267
  - Unknown elements evaluate to an empty collection, as they do in other
254
- engines. Use [static checking](#static-checking) to catch misspellings before runtime.
268
+ engines. Use [static checking](#static-checking), or set `strict: true` on an
269
+ engine or evaluation call, to catch misspellings before data is read.
255
270
  - Use choice stems such as `Observation.value`, not JSON keys such as
256
- `valueQuantity`. The analyzer reports the latter as an error.
271
+ `valueQuantity`. The analyzer and strict evaluation report the latter as an
272
+ error; lenient evaluation returns an empty collection.
273
+ - Function names and arguments are strict: an unknown function, wrong arity or
274
+ type, or undefined `%variable` is an error. See the
275
+ [runtime error table](docs/api.md#what-throws-errors-and-what-doesnt).
257
276
  - A bare search Bundle is treated as its entry resources for application helpers.
258
277
  Start an expression at `Bundle` to address the Bundle itself, or wrap it in an
259
278
  array to force one-resource treatment.
@@ -264,24 +283,35 @@ r4.evaluate("Patient.name.trace('names').given", patient, {
264
283
 
265
284
  ## Static checking
266
285
 
267
- Literal expressions infer useful result and input types without a compiler
268
- plugin:
286
+ Literal expressions use a bounded type-level parser that follows the runtime
287
+ grammar and built-in function rules. It infers result and input types without a
288
+ compiler plugin:
269
289
 
270
290
  ```ts
271
291
  const given = r4.compile('Patient.name.given')
272
292
  given.evaluate(patient) // string[]; the input must be a Patient
273
293
  ```
274
294
 
275
- Type inference stays conservative. Expressions outside its supported subset
276
- become `unknown[]` instead of producing an incorrect type.
295
+ Type inference stays conservative. Malformed, over-budget, dynamically widened,
296
+ or deliberately opaque expressions become `unknown[]` instead of producing an
297
+ incorrect type. Literal host values are inferred automatically. Static
298
+ `envTypes` and `varTypes` declarations cover ambiguous or widened data; see
299
+ [type context declarations](docs/api.md#type-context-declarations).
300
+ The type-level scanner budget is 64 tokens and 256 visited source characters.
301
+ Type inference computes a safe TypeScript type; it does not validate the
302
+ expression. ESLint and the CLI run the analyzer to report expression errors.
277
303
 
278
304
  Static checking has three layers:
279
305
 
280
- 1. TypeScript infers common literal expressions at compile time.
306
+ 1. TypeScript infers literal expressions at compile time.
281
307
  2. `fhirpath-ts/eslint` checks expression literals while linting.
282
308
  3. `fhirpath-check` runs the same analyzer without requiring ESLint and can load
283
309
  exported DTOs for a complete DTO check.
284
310
 
311
+ The CLI imports exported DTOs and records engines constructed by their modules.
312
+ This checks runtime context, registered functions, and cross-DTO calls that
313
+ TypeScript and source-only ESLint cannot see.
314
+
285
315
  The analyzer is also public for editors, tests, and other tools. It follows the
286
316
  [FHIRPath §11 rules](https://hl7.org/fhirpath/en/index.html#type-safety-and-strict-evaluation)
287
317
  and is tested against the official valid and invalid cases.
@@ -305,8 +335,8 @@ comparison with other implementations.
305
335
 
306
336
  ## Licensing and attribution
307
337
 
308
- Package code is part of this private repository. Third-party material and full
309
- license texts are collected in
338
+ Package code is licensed under Apache-2.0. Third-party material and full license
339
+ texts are collected in
310
340
  [`THIRD-PARTY-NOTICES.md`](./THIRD-PARTY-NOTICES.md).
311
341
 
312
342
  - The parser structure is adapted from Medplum (Apache-2.0).
@@ -320,13 +350,15 @@ license texts are collected in
320
350
  ## Development
321
351
 
322
352
  ```bash
323
- pnpm test
324
- pnpm coverage
325
353
  pnpm typecheck
354
+ pnpm test
326
355
  pnpm lint
327
356
  pnpm check:fhirpath
357
+ pnpm check:inference
328
358
  pnpm check:type-perf
329
- pnpm generate:r4
359
+ pnpm coverage
360
+ pnpm build
361
+ pnpm check:package
330
362
  ```
331
363
 
332
364
  Run the demo separately:
@@ -1,5 +1,6 @@
1
1
  import { type DtoClass } from '../api/dto.ts';
2
2
  import type { ModelProvider } from '../model/provider.ts';
3
+ import type { FhirpathTypeDeclarations } from '../typed/infer.ts';
3
4
  import { type AnalyzeOptions, type AnalyzerDiagnostic, type DeclaredFunction } from './analyze.ts';
4
5
  /** One `analyzeDto` finding: an analyzer diagnostic plus the class member it came from. */
5
6
  export interface DtoDiagnostic extends AnalyzerDiagnostic {
@@ -14,6 +15,9 @@ export interface AnalyzedContext {
14
15
  model?: ModelProvider;
15
16
  functions?: Record<string, DeclaredFunction>;
16
17
  env?: object;
18
+ envTypes?: FhirpathTypeDeclarations;
19
+ vars?: object;
20
+ varTypes?: FhirpathTypeDeclarations;
17
21
  };
18
22
  }
19
23
  /** A context that also knows which DTOs it registered, which is what a sweep needs. */
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-dto.d.ts","sourceRoot":"","sources":["../../src/analyzer/analyze-dto.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,QAAQ,EAAiB,MAAM,eAAe,CAAA;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EAEtB,MAAM,cAAc,CAAA;AAErB,2FAA2F;AAC3F,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAA;IACd,uFAAuF;IACvF,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,uFAAuF;AACvF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE;QAAE,KAAK,CAAC,EAAE,aAAa,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACzG;AAED,uFAAuF;AACvF,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAA;CACnC;AAED,8FAA8F;AAC9F,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,kFAAkF;IAClF,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB;AAgCD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,cAAc,GACvB,CAAC,aAAa,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CAIrC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,aAAa,EAAE,CA+CtF"}
1
+ {"version":3,"file":"analyze-dto.d.ts","sourceRoot":"","sources":["../../src/analyzer/analyze-dto.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,QAAQ,EAAiB,MAAM,eAAe,CAAA;AAE7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAEjE,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EAEtB,MAAM,cAAc,CAAA;AAGrB,2FAA2F;AAC3F,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAA;IACd,uFAAuF;IACvF,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,uFAAuF;AACvF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE;QACjB,KAAK,CAAC,EAAE,aAAa,CAAA;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;QAC5C,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,QAAQ,CAAC,EAAE,wBAAwB,CAAA;QACnC,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,wBAAwB,CAAA;KACpC,CAAA;CACF;AAED,uFAAuF;AACvF,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAA;CACnC;AAED,8FAA8F;AAC9F,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,kFAAkF;IAClF,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB;AA4BD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,cAAc,GACvB,CAAC,aAAa,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CAIrC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,aAAa,EAAE,CA+CtF"}
@@ -1,7 +1,9 @@
1
1
  import { columnResultType } from "../api/column-signature.js";
2
2
  import { dtoDefinition } from "../api/dto.js";
3
+ import { bareEnvironmentName } from "../engine/context.js";
3
4
  import { valueKindOfTypeName } from "../values/type-compat.js";
4
5
  import { analyzeExpressionDetailed, } from "./analyze.js";
6
+ import { analyzerEnvironmentVariables, analyzerVariables } from "./declarations.js";
5
7
  /**
6
8
  * The analyzer context for a DTO: what its engine supplies, with the caller's
7
9
  * own options layered on top *per name* — one function or variable a host
@@ -14,22 +16,19 @@ function contextOf(options) {
14
16
  if (engine === undefined) {
15
17
  return caller;
16
18
  }
17
- const { model, functions, env } = engine.defaults;
19
+ const { model, functions, env, envTypes, vars, varTypes } = engine.defaults;
20
+ const activeModel = caller.model ?? model;
18
21
  return {
19
22
  ...(model !== undefined && { model }),
20
23
  ...caller,
21
24
  functions: { ...functions, ...caller.functions },
22
- variables: { ...envVariables(env), ...caller.variables },
25
+ variables: {
26
+ ...analyzerEnvironmentVariables(env, envTypes, activeModel),
27
+ ...analyzerVariables(vars, varTypes),
28
+ ...caller.variables,
29
+ },
23
30
  };
24
31
  }
25
- /** An engine's env names, declared as variables the expressions may read. */
26
- function envVariables(env) {
27
- const variables = {};
28
- for (const name of Object.keys(env ?? {})) {
29
- variables[bare(name)] = {};
30
- }
31
- return variables;
32
- }
33
32
  /**
34
33
  * Every DTO an engine registered, checked against that engine's own context —
35
34
  * the sweep a project's checker runs, with no list to maintain: the engine
@@ -55,7 +54,7 @@ export function analyzeDto(dto, options) {
55
54
  rowTotal: { types: ['System.Integer'], single: true },
56
55
  };
57
56
  for (const name of [...Object.keys(definition.env ?? {}), ...(definition.callerEnv ?? [])]) {
58
- declared[bare(name)] = {};
57
+ declared[bareEnvironmentName(name)] = {};
59
58
  }
60
59
  const diagnostics = [];
61
60
  const analyze = (member, expression, column) => {
@@ -85,9 +84,9 @@ export function analyzeDto(dto, options) {
85
84
  const source = typeof value === 'string' ? value : sourceOf(value);
86
85
  if (source !== undefined) {
87
86
  // A var declares no type, so there is nothing to cross-check against.
88
- analyze(`vars.${bare(name)}`, source);
87
+ analyze(`vars.${bareEnvironmentName(name)}`, source);
89
88
  }
90
- declared[bare(name)] = {};
89
+ declared[bareEnvironmentName(name)] = {};
91
90
  }
92
91
  for (const [name, spec] of Object.entries(definition.columns)) {
93
92
  analyze(name, expressionOf(spec), spec);
@@ -135,7 +134,6 @@ function declaredTypeMismatch(column, yielded, options) {
135
134
  });
136
135
  return fits ? undefined : `Column declares type '${claimed}', but the expression yields ${yielded.join(' | ')}`;
137
136
  }
138
- const bare = (name) => (name.startsWith('%') ? name.slice(1) : name);
139
137
  /** A pre-compiled var's source text; a pre-bound TypedValue[] has nothing to analyze. */
140
138
  function sourceOf(value) {
141
139
  if (Array.isArray(value)) {
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-dto.js","sourceRoot":"","sources":["../../src/analyzer/analyze-dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAkC,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EACL,yBAAyB,GAK1B,MAAM,cAAc,CAAA;AA0BrB;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,OAAsC;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;IAC3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAA;IACf,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAA;IACjD,OAAO;QACL,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC;QACrC,GAAG,MAAM;QACT,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE;QAChD,SAAS,EAAE,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE;KACzD,CAAA;AACH,CAAC;AAED,6EAA6E;AAC7E,SAAS,YAAY,CAAC,GAAuB;IAC3C,MAAM,SAAS,GAAqC,EAAE,CAAA;IACtD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;IAC5B,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,OAAwB;IAExB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CACxF,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,GAAa,EAAE,OAA2B;IACnE,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAA;IAC1D,MAAM,QAAQ,GAAqC;QACjD,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QACrD,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;KACtD,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3F,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;IAC3B,CAAC;IACD,MAAM,WAAW,GAAoB,EAAE,CAAA;IACvC,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,UAAkB,EAAE,MAAmB,EAAQ,EAAE;QAChF,MAAM,aAAa,GAAmB;YACpC,GAAG,OAAO;YACV,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;YAC7C,SAAS,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE;SACjD,CAAA;QACD,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,yBAAyB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;QAC3F,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;YAC/B,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACvG,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,6FAA6F;YAC7F,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM;gBACN,UAAU;gBACV,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,QAAQ;gBACjB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;aAC/D,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAClE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,sEAAsE;YACtE,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACvC,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;IAC3B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,yEAAyE;AACzE,SAAS,YAAY,CAAC,MAAkB;IACtC,OAAO,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;AACrD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,WAAW,CAAC,MAAkB;IACrC,OAAO,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;AAChE,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAC3B,MAAkB,EAClB,OAA6B,EAC7B,OAAmC;IAEnC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IACnC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3E,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,OAAO,CAAA;IACjE,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC/B,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAA;QAC5B,kIAAkI;QAClI,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IACxG,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB,OAAO,gCAAgC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;AACjH,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAEpF,yFAAyF;AACzF,SAAS,QAAQ,CAAC,KAAa;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,MAAM,GAAI,KAA8B,CAAC,MAAM,CAAA;IACrD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;AACxD,CAAC"}
1
+ {"version":3,"file":"analyze-dto.js","sourceRoot":"","sources":["../../src/analyzer/analyze-dto.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  import '../functions/install.ts';
2
2
  import { type SourceSpan } from '../errors.ts';
3
3
  import type { ModelProvider } from '../model/provider.ts';
4
+ import type { AstNode } from '../parser/ast.ts';
5
+ import type { FhirpathTypeDeclarations } from '../typed/infer.ts';
6
+ import { type AnalyzerVariable, type AnalyzerVariableState } from './declarations.ts';
4
7
  import { type CustomFunctionSignature } from './signatures.ts';
5
8
  export interface AnalyzerDiagnostic {
6
9
  severity: 'error' | 'warning';
@@ -12,24 +15,24 @@ export interface AnalyzerDiagnostic {
12
15
  span: SourceSpan;
13
16
  }
14
17
  /** A host variable known to the analyzer. Omit its types to keep the value unknown. */
15
- export interface DeclaredVariable {
16
- /** Candidate type names ('Patient', 'System.String'); omit to leave the type unknown. */
17
- types?: string[];
18
- /** True when the variable always holds at most one item. */
19
- single?: boolean;
20
- }
18
+ export type DeclaredVariable = AnalyzerVariable;
21
19
  /** A host function declaration. Arity resolves the call; an optional signature checks it. */
22
20
  export type SingleDeclaredFunction = {
23
21
  minArity?: number;
24
22
  maxArity?: number;
25
23
  expression?: never;
26
24
  signature?: CustomFunctionSignature;
25
+ criteria?: never;
26
+ envTypes?: never;
27
27
  } | {
28
28
  /** The body of an expression-defined CustomFunction; its presence pins the arity to 0. */
29
29
  expression: unknown;
30
30
  minArity?: never;
31
31
  maxArity?: never;
32
32
  signature?: CustomFunctionSignature;
33
+ criteria?: boolean;
34
+ env?: Record<string, unknown>;
35
+ envTypes?: FhirpathTypeDeclarations;
33
36
  };
34
37
  /** Same-name functions selected by the call focus. Unknown focus keeps only their shared claims. */
35
38
  export interface OverloadedDeclaredFunction {
@@ -49,6 +52,10 @@ export interface AnalyzeOptions {
49
52
  /** Host-supplied environment variables by name (with or without the leading `%`). */
50
53
  variables?: Record<string, DeclaredVariable>;
51
54
  }
55
+ /** Internal strict-analysis options whose variables may retain exact runtime focus types. */
56
+ export interface RuntimeAnalyzeOptions extends Omit<AnalyzeOptions, 'variables'> {
57
+ variables?: Record<string, AnalyzerVariableState>;
58
+ }
52
59
  export interface AnalysisDetails {
53
60
  diagnostics: AnalyzerDiagnostic[];
54
61
  /**
@@ -70,6 +77,13 @@ export interface AnalysisDetails {
70
77
  */
71
78
  elementDependencies: string[];
72
79
  }
80
+ /** Runtime-known input state used by strict evaluation. Not part of the public analyzer API. */
81
+ export interface AnalyzerRoot {
82
+ types: string[] | undefined;
83
+ single: boolean | undefined;
84
+ /** Canonical runtime types in focus order; an empty array means an exactly empty focus. */
85
+ exactTypes?: string[];
86
+ }
73
87
  /**
74
88
  * Statically check one expression against the model: spec §11's strict-mode rules
75
89
  * (singleton misuse, wrong operand and argument types, incomparable equality)
@@ -95,4 +109,6 @@ export declare function analyzeSite(site: {
95
109
  }, options?: AnalyzeOptions): AnalyzerDiagnostic[];
96
110
  /** `analyzeExpression` plus the element paths the expression touches and its inferred result type. */
97
111
  export declare function analyzeExpressionDetailed(expression: string, options?: AnalyzeOptions): AnalysisDetails;
112
+ /** Analyze a parsed expression using facts from the actual evaluation focus. */
113
+ export declare function analyzeRuntimeAstDetailed(ast: AstNode, options: RuntimeAnalyzeOptions, root: AnalyzerRoot): AnalysisDetails;
98
114
  //# sourceMappingURL=analyze.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/analyzer/analyze.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/analyzer/analyze.ts"],"names":[],"mappings":"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"}