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.
- package/README.md +50 -18
- package/dist/analyzer/analyze-dto.d.ts +4 -0
- package/dist/analyzer/analyze-dto.d.ts.map +1 -1
- package/dist/analyzer/analyze-dto.js +12 -14
- package/dist/analyzer/analyze-dto.js.map +1 -1
- package/dist/analyzer/analyze.d.ts +22 -6
- package/dist/analyzer/analyze.d.ts.map +1 -1
- package/dist/analyzer/analyze.js +242 -98
- package/dist/analyzer/analyze.js.map +1 -1
- package/dist/analyzer/declarations.d.ts +26 -0
- package/dist/analyzer/declarations.d.ts.map +1 -0
- package/dist/analyzer/declarations.js +68 -0
- package/dist/analyzer/declarations.js.map +1 -0
- package/dist/analyzer/operator-rules.d.ts +127 -0
- package/dist/analyzer/operator-rules.d.ts.map +1 -0
- package/dist/analyzer/operator-rules.js +70 -0
- package/dist/analyzer/operator-rules.js.map +1 -0
- package/dist/analyzer/signatures.d.ts +1097 -10
- package/dist/analyzer/signatures.d.ts.map +1 -1
- package/dist/analyzer/signatures.js +70 -29
- package/dist/analyzer/signatures.js.map +1 -1
- package/dist/api/compile.d.ts +32 -8
- package/dist/api/compile.d.ts.map +1 -1
- package/dist/api/compile.js +2 -0
- package/dist/api/compile.js.map +1 -1
- package/dist/api/engine.d.ts +42 -16
- package/dist/api/engine.d.ts.map +1 -1
- package/dist/api/engine.js +2 -1
- package/dist/api/engine.js.map +1 -1
- package/dist/api/project.d.ts +8 -8
- package/dist/api/project.d.ts.map +1 -1
- package/dist/api/project.js +31 -19
- package/dist/api/project.js.map +1 -1
- package/dist/api/strict.d.ts +6 -0
- package/dist/api/strict.d.ts.map +1 -0
- package/dist/api/strict.js +71 -0
- package/dist/api/strict.js.map +1 -0
- package/dist/api/tagged.d.ts +4 -4
- package/dist/api/tagged.d.ts.map +1 -1
- package/dist/api/tagged.js.map +1 -1
- package/dist/cli/dto-check.js +7 -3
- package/dist/cli/dto-check.js.map +1 -1
- package/dist/engine/context.d.ts +3 -1
- package/dist/engine/context.d.ts.map +1 -1
- package/dist/engine/context.js +5 -1
- package/dist/engine/context.js.map +1 -1
- package/dist/engine/navigation.d.ts.map +1 -1
- package/dist/engine/navigation.js +7 -48
- package/dist/engine/navigation.js.map +1 -1
- package/dist/engine/type-matching.d.ts.map +1 -1
- package/dist/engine/type-matching.js +6 -16
- package/dist/engine/type-matching.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +102 -73
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/precedence.d.ts +368 -4
- package/dist/parser/precedence.d.ts.map +1 -1
- package/dist/parser/precedence.js +146 -32
- package/dist/parser/precedence.js.map +1 -1
- package/dist/r4/generated/resources-data.d.ts +6 -2
- package/dist/r4/generated/resources-data.d.ts.map +1 -1
- package/dist/r4/generated/resources-data.js +626 -28627
- package/dist/r4/generated/resources-data.js.map +1 -1
- package/dist/r4/generated/type-maps.d.ts +1367 -0
- package/dist/r4/generated/type-maps.d.ts.map +1 -1
- package/dist/r4/generated/types-data.d.ts +6 -2
- package/dist/r4/generated/types-data.d.ts.map +1 -1
- package/dist/r4/generated/types-data.js +84 -2204
- package/dist/r4/generated/types-data.js.map +1 -1
- package/dist/r4/index.d.ts +3 -1
- package/dist/r4/index.d.ts.map +1 -1
- package/dist/r4/index.js +10 -4
- package/dist/r4/index.js.map +1 -1
- package/dist/r4/model-data.d.ts +17 -0
- package/dist/r4/model-data.d.ts.map +1 -1
- package/dist/r4/model-data.js +118 -1
- package/dist/r4/model-data.js.map +1 -1
- package/dist/typed/context-maps.d.ts +23 -0
- package/dist/typed/context-maps.d.ts.map +1 -0
- package/dist/typed/context-maps.js +2 -0
- package/dist/typed/context-maps.js.map +1 -0
- package/dist/typed/infer.d.ts +99 -229
- package/dist/typed/infer.d.ts.map +1 -1
- package/dist/typed/infer.js +1 -84
- package/dist/typed/infer.js.map +1 -1
- package/dist/typed/inference-limits.d.ts +7 -0
- package/dist/typed/inference-limits.d.ts.map +1 -0
- package/dist/typed/inference-limits.js +6 -0
- package/dist/typed/inference-limits.js.map +1 -0
- package/dist/typed/metadata-compact.d.ts +189 -0
- package/dist/typed/metadata-compact.d.ts.map +1 -0
- package/dist/typed/metadata-compact.js +3 -0
- package/dist/typed/metadata-compact.js.map +1 -0
- package/dist/typed/parser.d.ts +515 -0
- package/dist/typed/parser.d.ts.map +1 -0
- package/dist/typed/parser.js +2 -0
- package/dist/typed/parser.js.map +1 -0
- package/dist/values/type-compat.d.ts +8 -0
- package/dist/values/type-compat.d.ts.map +1 -1
- package/dist/values/type-compat.js +44 -1
- package/dist/values/type-compat.js.map +1 -1
- package/package.json +20 -1
- package/src/analyzer/analyze-dto.ts +21 -17
- package/src/analyzer/analyze.ts +335 -109
- package/src/analyzer/declarations.ts +120 -0
- package/src/analyzer/operator-rules.ts +88 -0
- package/src/analyzer/signatures.ts +99 -41
- package/src/api/compile.ts +66 -11
- package/src/api/engine.ts +97 -33
- package/src/api/project.ts +54 -30
- package/src/api/strict.ts +112 -0
- package/src/api/tagged.ts +5 -5
- package/src/cli/dto-check.ts +7 -3
- package/src/engine/context.ts +7 -2
- package/src/engine/navigation.ts +7 -52
- package/src/engine/type-matching.ts +11 -17
- package/src/index.ts +25 -2
- package/src/parser/parser.ts +106 -74
- package/src/parser/precedence.ts +250 -33
- package/src/r4/generated/resources-data.ts +624 -28628
- package/src/r4/generated/type-maps.ts +1557 -0
- package/src/r4/generated/types-data.ts +82 -2205
- package/src/r4/index.ts +11 -5
- package/src/r4/model-data.ts +127 -0
- package/src/typed/context-maps.ts +41 -0
- package/src/typed/infer.ts +157 -425
- package/src/typed/inference-limits.ts +9 -0
- package/src/typed/metadata-compact.ts +307 -0
- package/src/typed/parser.ts +2277 -0
- package/src/values/type-compat.ts +48 -1
- package/dist/typed/perf-fixture.types.d.ts +0 -136
- package/dist/typed/perf-fixture.types.d.ts.map +0 -1
- package/dist/typed/perf-fixture.types.js +0 -2
- package/dist/typed/perf-fixture.types.js.map +0 -1
- 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](
|
|
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({
|
|
42
|
-
|
|
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](
|
|
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
|
-
{
|
|
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)
|
|
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
|
|
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
|
|
268
|
-
|
|
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.
|
|
276
|
-
become `unknown[]` instead of producing an
|
|
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
|
|
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
|
|
309
|
-
|
|
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
|
|
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;
|
|
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: {
|
|
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[
|
|
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.${
|
|
87
|
+
analyze(`vars.${bareEnvironmentName(name)}`, source);
|
|
89
88
|
}
|
|
90
|
-
declared[
|
|
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;
|
|
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;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EACL,yBAAyB,GAK1B,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAiCnF;;;;;;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,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAA;IAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAA;IACzC,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;YACT,GAAG,4BAA4B,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,CAAC;YAC3D,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC;YACpC,GAAG,MAAM,CAAC,SAAS;SACpB;KACF,CAAA;AACH,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,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;IAC1C,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,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACtD,CAAC;QACD,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;IAC1C,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,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,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
|
|
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":"AAAA,OAAO,yBAAyB,CAAA;AAGhC,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAEnE,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/analyzer/analyze.ts"],"names":[],"mappings":"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"}
|