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.
- package/LICENSE +201 -0
- package/README.md +391 -0
- package/THIRD-PARTY-NOTICES.md +296 -0
- package/dist/analyzer/analyze-dto.d.ts +45 -0
- package/dist/analyzer/analyze-dto.d.ts.map +1 -0
- package/dist/analyzer/analyze-dto.js +147 -0
- package/dist/analyzer/analyze-dto.js.map +1 -0
- package/dist/analyzer/analyze.d.ts +98 -0
- package/dist/analyzer/analyze.d.ts.map +1 -0
- package/dist/analyzer/analyze.js +925 -0
- package/dist/analyzer/analyze.js.map +1 -0
- package/dist/analyzer/expression-policy.d.ts +210 -0
- package/dist/analyzer/expression-policy.d.ts.map +1 -0
- package/dist/analyzer/expression-policy.js +254 -0
- package/dist/analyzer/expression-policy.js.map +1 -0
- package/dist/analyzer/index.d.ts +3 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +6 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/regex-safety.d.ts +10 -0
- package/dist/analyzer/regex-safety.d.ts.map +1 -0
- package/dist/analyzer/regex-safety.js +84 -0
- package/dist/analyzer/regex-safety.js.map +1 -0
- package/dist/analyzer/signatures.d.ts +72 -0
- package/dist/analyzer/signatures.d.ts.map +1 -0
- package/dist/analyzer/signatures.js +195 -0
- package/dist/analyzer/signatures.js.map +1 -0
- package/dist/api/bundle.d.ts +29 -0
- package/dist/api/bundle.d.ts.map +1 -0
- package/dist/api/bundle.js +108 -0
- package/dist/api/bundle.js.map +1 -0
- package/dist/api/cache.d.ts +10 -0
- package/dist/api/cache.d.ts.map +1 -0
- package/dist/api/cache.js +38 -0
- package/dist/api/cache.js.map +1 -0
- package/dist/api/column-signature.d.ts +53 -0
- package/dist/api/column-signature.d.ts.map +1 -0
- package/dist/api/column-signature.js +43 -0
- package/dist/api/column-signature.js.map +1 -0
- package/dist/api/compile.d.ts +120 -0
- package/dist/api/compile.d.ts.map +1 -0
- package/dist/api/compile.js +167 -0
- package/dist/api/compile.js.map +1 -0
- package/dist/api/constraints.d.ts +48 -0
- package/dist/api/constraints.d.ts.map +1 -0
- package/dist/api/constraints.js +52 -0
- package/dist/api/constraints.js.map +1 -0
- package/dist/api/dto.d.ts +134 -0
- package/dist/api/dto.d.ts.map +1 -0
- package/dist/api/dto.js +295 -0
- package/dist/api/dto.js.map +1 -0
- package/dist/api/engine.d.ts +136 -0
- package/dist/api/engine.d.ts.map +1 -0
- package/dist/api/engine.js +183 -0
- package/dist/api/engine.js.map +1 -0
- package/dist/api/evaluate.d.ts +7 -0
- package/dist/api/evaluate.d.ts.map +1 -0
- package/dist/api/evaluate.js +10 -0
- package/dist/api/evaluate.js.map +1 -0
- package/dist/api/project.d.ts +89 -0
- package/dist/api/project.d.ts.map +1 -0
- package/dist/api/project.js +150 -0
- package/dist/api/project.js.map +1 -0
- package/dist/api/tagged.d.ts +14 -0
- package/dist/api/tagged.d.ts.map +1 -0
- package/dist/api/tagged.js +13 -0
- package/dist/api/tagged.js.map +1 -0
- package/dist/cli/dto-check.d.ts +25 -0
- package/dist/cli/dto-check.d.ts.map +1 -0
- package/dist/cli/dto-check.js +77 -0
- package/dist/cli/dto-check.js.map +1 -0
- package/dist/cli/fhirpath-check.d.ts +3 -0
- package/dist/cli/fhirpath-check.d.ts.map +1 -0
- package/dist/cli/fhirpath-check.js +149 -0
- package/dist/cli/fhirpath-check.js.map +1 -0
- package/dist/cli/ts-loader.d.mts +3 -0
- package/dist/cli/ts-loader.d.mts.map +1 -0
- package/dist/cli/ts-loader.mjs +48 -0
- package/dist/cli/ts-loader.mjs.map +1 -0
- package/dist/engine/context.d.ts +173 -0
- package/dist/engine/context.d.ts.map +1 -0
- package/dist/engine/context.js +118 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/evaluator.d.ts +7 -0
- package/dist/engine/evaluator.d.ts.map +1 -0
- package/dist/engine/evaluator.js +196 -0
- package/dist/engine/evaluator.js.map +1 -0
- package/dist/engine/navigation.d.ts +11 -0
- package/dist/engine/navigation.d.ts.map +1 -0
- package/dist/engine/navigation.js +102 -0
- package/dist/engine/navigation.js.map +1 -0
- package/dist/engine/operators/collections.d.ts +12 -0
- package/dist/engine/operators/collections.d.ts.map +1 -0
- package/dist/engine/operators/collections.js +31 -0
- package/dist/engine/operators/collections.js.map +1 -0
- package/dist/engine/operators/comparison.d.ts +13 -0
- package/dist/engine/operators/comparison.d.ts.map +1 -0
- package/dist/engine/operators/comparison.js +77 -0
- package/dist/engine/operators/comparison.js.map +1 -0
- package/dist/engine/operators/equality.d.ts +19 -0
- package/dist/engine/operators/equality.d.ts.map +1 -0
- package/dist/engine/operators/equality.js +203 -0
- package/dist/engine/operators/equality.js.map +1 -0
- package/dist/engine/operators/index.d.ts +18 -0
- package/dist/engine/operators/index.d.ts.map +1 -0
- package/dist/engine/operators/index.js +30 -0
- package/dist/engine/operators/index.js.map +1 -0
- package/dist/engine/operators/logic.d.ts +8 -0
- package/dist/engine/operators/logic.d.ts.map +1 -0
- package/dist/engine/operators/logic.js +38 -0
- package/dist/engine/operators/logic.js.map +1 -0
- package/dist/engine/operators/math.d.ts +13 -0
- package/dist/engine/operators/math.d.ts.map +1 -0
- package/dist/engine/operators/math.js +198 -0
- package/dist/engine/operators/math.js.map +1 -0
- package/dist/engine/operators/strings.d.ts +8 -0
- package/dist/engine/operators/strings.d.ts.map +1 -0
- package/dist/engine/operators/strings.js +22 -0
- package/dist/engine/operators/strings.js.map +1 -0
- package/dist/engine/operators/types.d.ts +3 -0
- package/dist/engine/operators/types.d.ts.map +1 -0
- package/dist/engine/operators/types.js +15 -0
- package/dist/engine/operators/types.js.map +1 -0
- package/dist/engine/type-matching.d.ts +20 -0
- package/dist/engine/type-matching.d.ts.map +1 -0
- package/dist/engine/type-matching.js +122 -0
- package/dist/engine/type-matching.js.map +1 -0
- package/dist/errors.d.ts +25 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -0
- package/dist/eslint/index.d.ts +12 -0
- package/dist/eslint/index.d.ts.map +1 -0
- package/dist/eslint/index.js +316 -0
- package/dist/eslint/index.js.map +1 -0
- package/dist/fhir/html-checks.d.ts +7 -0
- package/dist/fhir/html-checks.d.ts.map +1 -0
- package/dist/fhir/html-checks.js +256 -0
- package/dist/fhir/html-checks.js.map +1 -0
- package/dist/fhir/model-navigation.d.ts +11 -0
- package/dist/fhir/model-navigation.d.ts.map +1 -0
- package/dist/fhir/model-navigation.js +142 -0
- package/dist/fhir/model-navigation.js.map +1 -0
- package/dist/functions/aggregate.d.ts +2 -0
- package/dist/functions/aggregate.d.ts.map +1 -0
- package/dist/functions/aggregate.js +127 -0
- package/dist/functions/aggregate.js.map +1 -0
- package/dist/functions/boundary.d.ts +2 -0
- package/dist/functions/boundary.d.ts.map +1 -0
- package/dist/functions/boundary.js +189 -0
- package/dist/functions/boundary.js.map +1 -0
- package/dist/functions/combining.d.ts +2 -0
- package/dist/functions/combining.d.ts.map +1 -0
- package/dist/functions/combining.js +13 -0
- package/dist/functions/combining.js.map +1 -0
- package/dist/functions/control.d.ts +2 -0
- package/dist/functions/control.d.ts.map +1 -0
- package/dist/functions/control.js +25 -0
- package/dist/functions/control.js.map +1 -0
- package/dist/functions/conversion.d.ts +3 -0
- package/dist/functions/conversion.d.ts.map +1 -0
- package/dist/functions/conversion.js +316 -0
- package/dist/functions/conversion.js.map +1 -0
- package/dist/functions/date-components.d.ts +2 -0
- package/dist/functions/date-components.d.ts.map +1 -0
- package/dist/functions/date-components.js +81 -0
- package/dist/functions/date-components.js.map +1 -0
- package/dist/functions/existence.d.ts +4 -0
- package/dist/functions/existence.d.ts.map +1 -0
- package/dist/functions/existence.js +97 -0
- package/dist/functions/existence.js.map +1 -0
- package/dist/functions/fhir.d.ts +2 -0
- package/dist/functions/fhir.d.ts.map +1 -0
- package/dist/functions/fhir.js +222 -0
- package/dist/functions/fhir.js.map +1 -0
- package/dist/functions/filtering.d.ts +2 -0
- package/dist/functions/filtering.d.ts.map +1 -0
- package/dist/functions/filtering.js +112 -0
- package/dist/functions/filtering.js.map +1 -0
- package/dist/functions/install.d.ts +18 -0
- package/dist/functions/install.d.ts.map +1 -0
- package/dist/functions/install.js +20 -0
- package/dist/functions/install.js.map +1 -0
- package/dist/functions/iteration.d.ts +7 -0
- package/dist/functions/iteration.d.ts.map +1 -0
- package/dist/functions/iteration.js +9 -0
- package/dist/functions/iteration.js.map +1 -0
- package/dist/functions/math.d.ts +2 -0
- package/dist/functions/math.d.ts.map +1 -0
- package/dist/functions/math.js +152 -0
- package/dist/functions/math.js.map +1 -0
- package/dist/functions/reflection.d.ts +2 -0
- package/dist/functions/reflection.d.ts.map +1 -0
- package/dist/functions/reflection.js +23 -0
- package/dist/functions/reflection.js.map +1 -0
- package/dist/functions/registry.d.ts +28 -0
- package/dist/functions/registry.d.ts.map +1 -0
- package/dist/functions/registry.js +46 -0
- package/dist/functions/registry.js.map +1 -0
- package/dist/functions/sort.d.ts +2 -0
- package/dist/functions/sort.d.ts.map +1 -0
- package/dist/functions/sort.js +48 -0
- package/dist/functions/sort.js.map +1 -0
- package/dist/functions/string.d.ts +2 -0
- package/dist/functions/string.d.ts.map +1 -0
- package/dist/functions/string.js +353 -0
- package/dist/functions/string.js.map +1 -0
- package/dist/functions/subsetting.d.ts +2 -0
- package/dist/functions/subsetting.d.ts.map +1 -0
- package/dist/functions/subsetting.js +72 -0
- package/dist/functions/subsetting.js.map +1 -0
- package/dist/functions/tree.d.ts +8 -0
- package/dist/functions/tree.d.ts.map +1 -0
- package/dist/functions/tree.js +109 -0
- package/dist/functions/tree.js.map +1 -0
- package/dist/functions/type-specifier.d.ts +8 -0
- package/dist/functions/type-specifier.d.ts.map +1 -0
- package/dist/functions/type-specifier.js +27 -0
- package/dist/functions/type-specifier.js.map +1 -0
- package/dist/functions/utility.d.ts +2 -0
- package/dist/functions/utility.d.ts.map +1 -0
- package/dist/functions/utility.js +76 -0
- package/dist/functions/utility.js.map +1 -0
- package/dist/functions/variables.d.ts +2 -0
- package/dist/functions/variables.d.ts.map +1 -0
- package/dist/functions/variables.js +35 -0
- package/dist/functions/variables.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer/lexer.d.ts +4 -0
- package/dist/lexer/lexer.d.ts.map +1 -0
- package/dist/lexer/lexer.js +318 -0
- package/dist/lexer/lexer.js.map +1 -0
- package/dist/lexer/tokens.d.ts +23 -0
- package/dist/lexer/tokens.d.ts.map +1 -0
- package/dist/lexer/tokens.js +40 -0
- package/dist/lexer/tokens.js.map +1 -0
- package/dist/model/provider.d.ts +36 -0
- package/dist/model/provider.d.ts.map +1 -0
- package/dist/model/provider.js +2 -0
- package/dist/model/provider.js.map +1 -0
- package/dist/parser/ast.d.ts +104 -0
- package/dist/parser/ast.d.ts.map +1 -0
- package/dist/parser/ast.js +2 -0
- package/dist/parser/ast.js.map +1 -0
- package/dist/parser/parser.d.ts +4 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +299 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/parser/precedence.d.ts +24 -0
- package/dist/parser/precedence.d.ts.map +1 -0
- package/dist/parser/precedence.js +52 -0
- package/dist/parser/precedence.js.map +1 -0
- package/dist/parser/printer.d.ts +4 -0
- package/dist/parser/printer.d.ts.map +1 -0
- package/dist/parser/printer.js +112 -0
- package/dist/parser/printer.js.map +1 -0
- package/dist/r4/generated/resources-data.d.ts +3 -0
- package/dist/r4/generated/resources-data.d.ts.map +1 -0
- package/dist/r4/generated/resources-data.js +28628 -0
- package/dist/r4/generated/resources-data.js.map +1 -0
- package/dist/r4/generated/type-maps.d.ts +43153 -0
- package/dist/r4/generated/type-maps.d.ts.map +1 -0
- package/dist/r4/generated/type-maps.js +4 -0
- package/dist/r4/generated/type-maps.js.map +1 -0
- package/dist/r4/generated/types-data.d.ts +3 -0
- package/dist/r4/generated/types-data.d.ts.map +1 -0
- package/dist/r4/generated/types-data.js +2205 -0
- package/dist/r4/generated/types-data.js.map +1 -0
- package/dist/r4/index.d.ts +9 -0
- package/dist/r4/index.d.ts.map +1 -0
- package/dist/r4/index.js +94 -0
- package/dist/r4/index.js.map +1 -0
- package/dist/r4/model-data.d.ts +17 -0
- package/dist/r4/model-data.d.ts.map +1 -0
- package/dist/r4/model-data.js +2 -0
- package/dist/r4/model-data.js.map +1 -0
- package/dist/sites/index.d.ts +31 -0
- package/dist/sites/index.d.ts.map +1 -0
- package/dist/sites/index.js +205 -0
- package/dist/sites/index.js.map +1 -0
- package/dist/typed/infer.d.ts +234 -0
- package/dist/typed/infer.d.ts.map +1 -0
- package/dist/typed/infer.js +85 -0
- package/dist/typed/infer.js.map +1 -0
- package/dist/typed/perf-fixture.types.d.ts +136 -0
- package/dist/typed/perf-fixture.types.d.ts.map +1 -0
- package/dist/typed/perf-fixture.types.js +2 -0
- package/dist/typed/perf-fixture.types.js.map +1 -0
- package/dist/values/collection.d.ts +24 -0
- package/dist/values/collection.d.ts.map +1 -0
- package/dist/values/collection.js +51 -0
- package/dist/values/collection.js.map +1 -0
- package/dist/values/datetime.d.ts +54 -0
- package/dist/values/datetime.d.ts.map +1 -0
- package/dist/values/datetime.js +226 -0
- package/dist/values/datetime.js.map +1 -0
- package/dist/values/decimal.d.ts +48 -0
- package/dist/values/decimal.d.ts.map +1 -0
- package/dist/values/decimal.js +188 -0
- package/dist/values/decimal.js.map +1 -0
- package/dist/values/numeric.d.ts +24 -0
- package/dist/values/numeric.d.ts.map +1 -0
- package/dist/values/numeric.js +53 -0
- package/dist/values/numeric.js.map +1 -0
- package/dist/values/quantity.d.ts +49 -0
- package/dist/values/quantity.d.ts.map +1 -0
- package/dist/values/quantity.js +297 -0
- package/dist/values/quantity.js.map +1 -0
- package/dist/values/temporal-arithmetic.d.ts +17 -0
- package/dist/values/temporal-arithmetic.d.ts.map +1 -0
- package/dist/values/temporal-arithmetic.js +183 -0
- package/dist/values/temporal-arithmetic.js.map +1 -0
- package/dist/values/temporal-compare.d.ts +9 -0
- package/dist/values/temporal-compare.d.ts.map +1 -0
- package/dist/values/temporal-compare.js +59 -0
- package/dist/values/temporal-compare.js.map +1 -0
- package/dist/values/type-compat.d.ts +47 -0
- package/dist/values/type-compat.d.ts.map +1 -0
- package/dist/values/type-compat.js +100 -0
- package/dist/values/type-compat.js.map +1 -0
- package/dist/values/typed-value.d.ts +48 -0
- package/dist/values/typed-value.d.ts.map +1 -0
- package/dist/values/typed-value.js +117 -0
- package/dist/values/typed-value.js.map +1 -0
- package/dist/values/ucum.d.ts +14 -0
- package/dist/values/ucum.d.ts.map +1 -0
- package/dist/values/ucum.js +146 -0
- package/dist/values/ucum.js.map +1 -0
- package/package.json +137 -0
- package/src/analyzer/analyze-dto.ts +195 -0
- package/src/analyzer/analyze.ts +1181 -0
- package/src/analyzer/expression-policy.ts +434 -0
- package/src/analyzer/index.ts +23 -0
- package/src/analyzer/regex-safety.ts +85 -0
- package/src/analyzer/signatures.ts +260 -0
- package/src/api/bundle.ts +132 -0
- package/src/api/cache.ts +40 -0
- package/src/api/column-signature.ts +71 -0
- package/src/api/compile.ts +308 -0
- package/src/api/constraints.ts +104 -0
- package/src/api/dto.ts +445 -0
- package/src/api/engine.ts +328 -0
- package/src/api/evaluate.ts +11 -0
- package/src/api/project.ts +255 -0
- package/src/api/tagged.ts +35 -0
- package/src/cli/dto-check.ts +94 -0
- package/src/cli/fhirpath-check.ts +168 -0
- package/src/cli/ts-loader.mjs +49 -0
- package/src/engine/context.ts +282 -0
- package/src/engine/evaluator.ts +246 -0
- package/src/engine/navigation.ts +106 -0
- package/src/engine/operators/collections.ts +34 -0
- package/src/engine/operators/comparison.ts +82 -0
- package/src/engine/operators/equality.ts +232 -0
- package/src/engine/operators/index.ts +65 -0
- package/src/engine/operators/logic.ts +53 -0
- package/src/engine/operators/math.ts +225 -0
- package/src/engine/operators/strings.ts +25 -0
- package/src/engine/operators/types.ts +16 -0
- package/src/engine/type-matching.ts +148 -0
- package/src/errors.ts +33 -0
- package/src/eslint/index.ts +388 -0
- package/src/fhir/html-checks.ts +266 -0
- package/src/fhir/model-navigation.ts +148 -0
- package/src/functions/aggregate.ts +136 -0
- package/src/functions/boundary.ts +209 -0
- package/src/functions/combining.ts +15 -0
- package/src/functions/control.ts +25 -0
- package/src/functions/conversion.ts +349 -0
- package/src/functions/date-components.ts +88 -0
- package/src/functions/existence.ts +107 -0
- package/src/functions/fhir.ts +247 -0
- package/src/functions/filtering.ts +120 -0
- package/src/functions/install.ts +19 -0
- package/src/functions/iteration.ts +21 -0
- package/src/functions/math.ts +167 -0
- package/src/functions/reflection.ts +24 -0
- package/src/functions/registry.ts +72 -0
- package/src/functions/sort.ts +68 -0
- package/src/functions/string.ts +413 -0
- package/src/functions/subsetting.ts +89 -0
- package/src/functions/tree.ts +112 -0
- package/src/functions/type-specifier.ts +29 -0
- package/src/functions/utility.ts +82 -0
- package/src/functions/variables.ts +36 -0
- package/src/index.ts +30 -0
- package/src/lexer/lexer.ts +341 -0
- package/src/lexer/tokens.ts +69 -0
- package/src/model/provider.ts +36 -0
- package/src/parser/ast.ts +164 -0
- package/src/parser/parser.ts +321 -0
- package/src/parser/precedence.ts +52 -0
- package/src/parser/printer.ts +114 -0
- package/src/r4/generated/resources-data.ts +28631 -0
- package/src/r4/generated/type-maps.ts +22145 -0
- package/src/r4/generated/types-data.ts +2208 -0
- package/src/r4/index.ts +107 -0
- package/src/r4/model-data.ts +17 -0
- package/src/sites/index.ts +285 -0
- package/src/typed/infer.ts +433 -0
- package/src/typed/perf-fixture.types.ts +143 -0
- package/src/values/collection.ts +57 -0
- package/src/values/datetime.ts +285 -0
- package/src/values/decimal.ts +213 -0
- package/src/values/numeric.ts +63 -0
- package/src/values/quantity.ts +358 -0
- package/src/values/temporal-arithmetic.ts +231 -0
- package/src/values/temporal-compare.ts +65 -0
- package/src/values/type-compat.ts +133 -0
- package/src/values/typed-value.ts +151 -0
- package/src/values/ucum.ts +181 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engine/operators/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGrD,MAAM,CAAC,MAAM,YAAY,GAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACjF,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,qFAAqF;IACrF,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC,CAAA;IACxF,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,OAAO,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9B,CAAC,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type TypedValue } from '../values/typed-value.ts';
|
|
2
|
+
import type { EvaluationContext, HostFunction, HostSingleFunction } from './context.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Does an item satisfy a type specifier? Shared by `is`/`as`/`ofType()` and the
|
|
5
|
+
* static analyzer. Resolution order per spec §10.1: the context model's types
|
|
6
|
+
* first, then the System namespace. `is` always walks subtypes; `as`/`ofType`
|
|
7
|
+
* do too, except when the requested name aliases a System primitive, where the
|
|
8
|
+
* official inheritance tests pin an exact match instead (see isSystemAmbiguousName).
|
|
9
|
+
*/
|
|
10
|
+
export declare function itemMatchesType(context: EvaluationContext, item: TypedValue, parts: string[], options?: {
|
|
11
|
+
exact?: boolean;
|
|
12
|
+
}): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Selects a host function by focus type. Same-name overloads use registration
|
|
15
|
+
* order. If none accepts the focus, one error lists all accepted input types.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveHostCall(name: string, host: HostFunction, context: EvaluationContext, input: TypedValue[]): HostSingleFunction;
|
|
18
|
+
/** True when a single-part type name resolves in the model or the System namespace. */
|
|
19
|
+
export declare function isKnownTypeName(context: EvaluationContext, parts: string[]): boolean;
|
|
20
|
+
//# sourceMappingURL=type-matching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-matching.d.ts","sourceRoot":"","sources":["../../src/engine/type-matching.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,UAAU,EAAiB,MAAM,0BAA0B,CAAA;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAsBvF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAsCT;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,UAAU,EAAE,GAClB,kBAAkB,CAwBpB;AAeD,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CASpF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { FhirPathTypeError } from "../errors.js";
|
|
2
|
+
import { resolveByInput, unsatisfiedInput } from "../values/type-compat.js";
|
|
3
|
+
import { OBJECT_TYPE, typeLocalName } from "../values/typed-value.js";
|
|
4
|
+
const SYSTEM_LOCAL_NAMES = new Set([
|
|
5
|
+
'Any',
|
|
6
|
+
'Boolean',
|
|
7
|
+
'String',
|
|
8
|
+
'Integer',
|
|
9
|
+
'Long',
|
|
10
|
+
'Decimal',
|
|
11
|
+
'Date',
|
|
12
|
+
'DateTime',
|
|
13
|
+
'Time',
|
|
14
|
+
'Quantity',
|
|
15
|
+
]);
|
|
16
|
+
const SYSTEM_LOCAL_NAMES_LOWER = new Set([...SYSTEM_LOCAL_NAMES].map(name => name.toLowerCase()));
|
|
17
|
+
/** True when an unqualified name may mean a System primitive and requires exact `as`/`ofType` matching. */
|
|
18
|
+
function isSystemAmbiguousName(name) {
|
|
19
|
+
return SYSTEM_LOCAL_NAMES_LOWER.has(name.toLowerCase());
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Does an item satisfy a type specifier? Shared by `is`/`as`/`ofType()` and the
|
|
23
|
+
* static analyzer. Resolution order per spec §10.1: the context model's types
|
|
24
|
+
* first, then the System namespace. `is` always walks subtypes; `as`/`ofType`
|
|
25
|
+
* do too, except when the requested name aliases a System primitive, where the
|
|
26
|
+
* official inheritance tests pin an exact match instead (see isSystemAmbiguousName).
|
|
27
|
+
*/
|
|
28
|
+
export function itemMatchesType(context, item, parts, options) {
|
|
29
|
+
const exact = options?.exact === true;
|
|
30
|
+
if (parts.length === 2 && parts[0] === 'System') {
|
|
31
|
+
// FHIR-typed values do not answer System-qualified questions (testType14).
|
|
32
|
+
// System type names are case-sensitive, so `System.STRING` is not `System.String`
|
|
33
|
+
// (the lowercase fallback in matchesSystemType is only for unqualified names).
|
|
34
|
+
const systemName = parts[1];
|
|
35
|
+
return systemName === 'Any' ? item.type.startsWith('System.') : item.type === `System.${systemName}`;
|
|
36
|
+
}
|
|
37
|
+
const model = context.model;
|
|
38
|
+
if (parts.length === 2) {
|
|
39
|
+
if (model && parts[0] === model.namespace) {
|
|
40
|
+
const typeName = parts[1];
|
|
41
|
+
const canonical = model.resolveType(typeName);
|
|
42
|
+
if (canonical === undefined) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return exact && isSystemAmbiguousName(typeName)
|
|
46
|
+
? item.type === canonical
|
|
47
|
+
: model.isSubtypeOf(item.type, canonical);
|
|
48
|
+
}
|
|
49
|
+
return item.type === parts.join('.');
|
|
50
|
+
}
|
|
51
|
+
const name = parts[0];
|
|
52
|
+
// System-typed values answer from the System namespace.
|
|
53
|
+
if (item.type.startsWith('System.')) {
|
|
54
|
+
return matchesSystemType(item, name);
|
|
55
|
+
}
|
|
56
|
+
if (model) {
|
|
57
|
+
const canonical = model.resolveType(name);
|
|
58
|
+
if (canonical !== undefined) {
|
|
59
|
+
return exact && isSystemAmbiguousName(name) ? item.type === canonical : model.isSubtypeOf(item.type, canonical);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Dynamic fallback: resource and complex types match on their local name. The
|
|
63
|
+
// internal Object marker never answers a type question — `ofType(Object)` is not
|
|
64
|
+
// a way to select untyped values.
|
|
65
|
+
return item.type !== OBJECT_TYPE && typeLocalName(item.type) === name;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Selects a host function by focus type. Same-name overloads use registration
|
|
69
|
+
* order. If none accepts the focus, one error lists all accepted input types.
|
|
70
|
+
*/
|
|
71
|
+
export function resolveHostCall(name, host, context, input) {
|
|
72
|
+
if (!('overloads' in host)) {
|
|
73
|
+
// `unsatisfiedInput` handles an undeclared input too. Returning first is
|
|
74
|
+
// what stops the many host functions that declare no types from walking the
|
|
75
|
+
// focus at all.
|
|
76
|
+
if (host.inputTypes === undefined) {
|
|
77
|
+
return host;
|
|
78
|
+
}
|
|
79
|
+
const unsatisfied = unsatisfiedInput(context.model, host.inputTypes, focusTypes(input));
|
|
80
|
+
if (unsatisfied === undefined) {
|
|
81
|
+
return host;
|
|
82
|
+
}
|
|
83
|
+
throw wrongFocus(name, unsatisfied);
|
|
84
|
+
}
|
|
85
|
+
const resolution = resolveByInput(context.model, host.overloads, overload => overload.inputTypes, input.map(item => item.type));
|
|
86
|
+
if ('resolved' in resolution) {
|
|
87
|
+
return resolution.resolved;
|
|
88
|
+
}
|
|
89
|
+
throw wrongFocus(name, resolution.unsatisfied);
|
|
90
|
+
}
|
|
91
|
+
function wrongFocus(name, { wanted, found }) {
|
|
92
|
+
return new FhirPathTypeError(`Function '${name}' expects ${wanted.join(' | ')} as input, but the focus is ${found.join(' | ')}`);
|
|
93
|
+
}
|
|
94
|
+
/** The focus's type names, read one at a time. A valid call stops at the first item that fits. */
|
|
95
|
+
function* focusTypes(input) {
|
|
96
|
+
for (const item of input) {
|
|
97
|
+
yield item.type;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** True when a single-part type name resolves in the model or the System namespace. */
|
|
101
|
+
export function isKnownTypeName(context, parts) {
|
|
102
|
+
if (parts.length === 2) {
|
|
103
|
+
return parts[0] === 'System' ? SYSTEM_LOCAL_NAMES.has(parts[1]) : parts[0] === context.model?.namespace;
|
|
104
|
+
}
|
|
105
|
+
const name = parts[0];
|
|
106
|
+
if (context.model?.resolveType(name) !== undefined) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
return SYSTEM_LOCAL_NAMES.has(name);
|
|
110
|
+
}
|
|
111
|
+
function matchesSystemType(item, name) {
|
|
112
|
+
if (name === 'Any') {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
const local = typeLocalName(item.type);
|
|
116
|
+
if (local === name) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
// Lowercase FHIR spellings (`boolean`, `dateTime`) reach the System twin.
|
|
120
|
+
return local.toLowerCase() === name.toLowerCase();
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=type-matching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-matching.js","sourceRoot":"","sources":["../../src/engine/type-matching.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface SourceSpan {
|
|
2
|
+
/** 0-based offset of the first character. */
|
|
3
|
+
start: number;
|
|
4
|
+
/** 0-based offset one past the last character. */
|
|
5
|
+
end: number;
|
|
6
|
+
/** 1-based line of the first character. */
|
|
7
|
+
line: number;
|
|
8
|
+
/** 1-based column of the first character. */
|
|
9
|
+
column: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class FhirPathError extends Error {
|
|
12
|
+
constructor(message: string);
|
|
13
|
+
}
|
|
14
|
+
/** The expression does not match the FHIRPath grammar. Maps to `invalid="syntax"` in the official test suite. */
|
|
15
|
+
export declare class FhirPathSyntaxError extends FhirPathError {
|
|
16
|
+
readonly span: SourceSpan;
|
|
17
|
+
constructor(message: string, span: SourceSpan);
|
|
18
|
+
}
|
|
19
|
+
/** The expression is grammatical but breaks a typing rule, e.g. a singleton rule or an undefined `%var`. Maps to `invalid="semantic"`. */
|
|
20
|
+
export declare class FhirPathTypeError extends FhirPathError {
|
|
21
|
+
}
|
|
22
|
+
/** Evaluation failed on the given input, e.g. `single()` over many items. Maps to `invalid="execution"`. */
|
|
23
|
+
export declare class FhirPathRuntimeError extends FhirPathError {
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAA;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAA;IACX,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,iHAAiH;AACjH,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;gBAEb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;CAI9C;AAED,0IAA0I;AAC1I,qBAAa,iBAAkB,SAAQ,aAAa;CAAG;AAEvD,4GAA4G;AAC5G,qBAAa,oBAAqB,SAAQ,aAAa;CAAG"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class FhirPathError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = new.target.name;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
/** The expression does not match the FHIRPath grammar. Maps to `invalid="syntax"` in the official test suite. */
|
|
8
|
+
export class FhirPathSyntaxError extends FhirPathError {
|
|
9
|
+
span;
|
|
10
|
+
constructor(message, span) {
|
|
11
|
+
super(`${message} (line ${span.line}, column ${span.column})`);
|
|
12
|
+
this.span = span;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** The expression is grammatical but breaks a typing rule, e.g. a singleton rule or an undefined `%var`. Maps to `invalid="semantic"`. */
|
|
16
|
+
export class FhirPathTypeError extends FhirPathError {
|
|
17
|
+
}
|
|
18
|
+
/** Evaluation failed on the given input, e.g. `single()` over many items. Maps to `invalid="execution"`. */
|
|
19
|
+
export class FhirPathRuntimeError extends FhirPathError {
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAA;IAC7B,CAAC;CACF;AAED,iHAAiH;AACjH,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAC3C,IAAI,CAAY;IAEzB,YAAY,OAAe,EAAE,IAAgB;QAC3C,KAAK,CAAC,GAAG,OAAO,UAAU,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;QAC9D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED,0IAA0I;AAC1I,MAAM,OAAO,iBAAkB,SAAQ,aAAa;CAAG;AAEvD,4GAA4G;AAC5G,MAAM,OAAO,oBAAqB,SAAQ,aAAa;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eslint/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AA0XlC,QAAA,MAAM,MAAM;;;;;;;;CAKX,CAAA;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { analyzeSite } from "../analyzer/analyze.js";
|
|
3
|
+
import { CALL_SITES, columnFunctionDeclaration, constructsEngine, declaredColumnOverloads, DTO_BASE_NAME, dtoRootsOf, expressionEntries, isCheckedCall, isCheckedTag, isForeignModule, rootOf, siteContext, TAG_NAME, } from "../analyzer/expression-policy.js";
|
|
4
|
+
import { r4Model } from "../r4/index.js";
|
|
5
|
+
function isStringLiteral(node) {
|
|
6
|
+
return node.type === 'Literal' && typeof node.value === 'string';
|
|
7
|
+
}
|
|
8
|
+
/** Statically-known property key (`path` in `{ path: ... }` or `{ 'path': ... }`), undefined when computed. */
|
|
9
|
+
function propertyKeyName(property) {
|
|
10
|
+
if (property.computed) {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
if (property.key.type === 'Identifier') {
|
|
14
|
+
return property.key.name;
|
|
15
|
+
}
|
|
16
|
+
return isStringLiteral(property.key) ? property.key.value : undefined;
|
|
17
|
+
}
|
|
18
|
+
/** How the shared shape extractor reads ESTree nodes. */
|
|
19
|
+
const estreeAst = {
|
|
20
|
+
string: node => (isStringLiteral(node) ? { node, expression: node.value } : undefined),
|
|
21
|
+
boolean: node => (node.type === 'Literal' && typeof node.value === 'boolean' ? node.value : undefined),
|
|
22
|
+
properties: node => node.type === 'ObjectExpression'
|
|
23
|
+
? node.properties.flatMap(property => property.type === 'Property' ? [{ name: propertyKeyName(property), value: property.value }] : [])
|
|
24
|
+
: undefined,
|
|
25
|
+
elements: node => (node.type === 'ArrayExpression' ? node.elements.filter(element => element !== null) : undefined),
|
|
26
|
+
};
|
|
27
|
+
/** Add every identifier a binding pattern declares (`x`, `{ r4 }`, `[a, ...rest]`, `x = 1`). */
|
|
28
|
+
function addPatternNames(pattern, into) {
|
|
29
|
+
switch (pattern.type) {
|
|
30
|
+
case 'Identifier':
|
|
31
|
+
into.add(pattern.name);
|
|
32
|
+
return;
|
|
33
|
+
case 'ObjectPattern':
|
|
34
|
+
for (const property of pattern.properties) {
|
|
35
|
+
addPatternNames(property.type === 'RestElement' ? property.argument : property.value, into);
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
case 'ArrayPattern':
|
|
39
|
+
for (const element of pattern.elements) {
|
|
40
|
+
if (element) {
|
|
41
|
+
addPatternNames(element, into);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
case 'AssignmentPattern':
|
|
46
|
+
addPatternNames(pattern.left, into);
|
|
47
|
+
return;
|
|
48
|
+
case 'RestElement':
|
|
49
|
+
addPatternNames(pattern.argument, into);
|
|
50
|
+
return;
|
|
51
|
+
default:
|
|
52
|
+
// A MemberExpression target does not declare a new name.
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Leftmost identifier of a member-expression callee (`Handlebars` in `Handlebars.compile`). */
|
|
57
|
+
function receiverRoot(callee) {
|
|
58
|
+
if (callee.type !== 'MemberExpression') {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
let current = callee.object;
|
|
62
|
+
while (current.type === 'MemberExpression') {
|
|
63
|
+
current = current.object;
|
|
64
|
+
}
|
|
65
|
+
return current.type === 'Identifier' ? current.name : undefined;
|
|
66
|
+
}
|
|
67
|
+
/** Returns an identifier name or the property name of a non-computed member access. */
|
|
68
|
+
function nameOf(node) {
|
|
69
|
+
if (node.type === 'Identifier') {
|
|
70
|
+
return node.name;
|
|
71
|
+
}
|
|
72
|
+
return node.type === 'MemberExpression' && !node.computed && node.property.type === 'Identifier'
|
|
73
|
+
? node.property.name
|
|
74
|
+
: undefined;
|
|
75
|
+
}
|
|
76
|
+
/** The name of the field a `@column(...)` decorator belongs to, from the call's ancestors. */
|
|
77
|
+
function decoratedFieldName(ancestors) {
|
|
78
|
+
const member = ancestors.at(-2);
|
|
79
|
+
if (member?.type !== 'PropertyDefinition') {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const key = member.key;
|
|
83
|
+
if (key?.type === 'Identifier') {
|
|
84
|
+
return key.name;
|
|
85
|
+
}
|
|
86
|
+
return key !== undefined && isStringLiteral(key) ? key.value : undefined;
|
|
87
|
+
}
|
|
88
|
+
/** A class's heritage, as `dtoRootsOf` reads it: its own DTO root, or the name of the class it extends. */
|
|
89
|
+
function heritageOf(node) {
|
|
90
|
+
const base = node.superClass;
|
|
91
|
+
const rootArgument = base?.type === 'CallExpression' && nameOf(base.callee) === DTO_BASE_NAME ? base.arguments[0] : undefined;
|
|
92
|
+
return {
|
|
93
|
+
name: node.id?.name,
|
|
94
|
+
ownRoot: rootArgument === undefined ? undefined : estreeAst.string(rootArgument)?.expression,
|
|
95
|
+
baseName: base?.type === 'Identifier' ? base.name : undefined,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The heritage of the nearest enclosing class — what a `@column` field's
|
|
100
|
+
* expressions analyze against, once `dtoRootsOf` has resolved it against the rest
|
|
101
|
+
* of the file. Undefined when the field is not inside a class at all.
|
|
102
|
+
*/
|
|
103
|
+
function enclosingClass(ancestors) {
|
|
104
|
+
for (let index = ancestors.length - 1; index >= 0; index--) {
|
|
105
|
+
const node = ancestors[index];
|
|
106
|
+
if (node?.type === 'ClassDeclaration' || node?.type === 'ClassExpression') {
|
|
107
|
+
return heritageOf(node);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* ESLint rule for literal FHIRPath expressions. The shared source policy decides
|
|
114
|
+
* which calls and tags count. `packages` adds trusted import prefixes, and
|
|
115
|
+
* `localImports` trusts relative imports.
|
|
116
|
+
*/
|
|
117
|
+
const noInvalidExpressions = {
|
|
118
|
+
meta: {
|
|
119
|
+
type: 'problem',
|
|
120
|
+
docs: {
|
|
121
|
+
description: 'check FHIRPath expression literals with the static analyzer',
|
|
122
|
+
},
|
|
123
|
+
schema: [
|
|
124
|
+
{
|
|
125
|
+
type: 'object',
|
|
126
|
+
properties: {
|
|
127
|
+
packages: { type: 'array', items: { type: 'string' } },
|
|
128
|
+
localImports: { type: 'boolean' },
|
|
129
|
+
// Host-supplied environment variables and functions the checked code
|
|
130
|
+
// passes at runtime — AnalyzeOptions.variables / AnalyzeOptions.functions.
|
|
131
|
+
variables: { type: 'object' },
|
|
132
|
+
functions: { type: 'object' },
|
|
133
|
+
},
|
|
134
|
+
additionalProperties: false,
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
create(context) {
|
|
139
|
+
const options = (context.options[0] ?? {});
|
|
140
|
+
// Decide candidate sites at Program:exit because imports and engine
|
|
141
|
+
// declarations may appear after calls that depend on them.
|
|
142
|
+
const foreign = new Set();
|
|
143
|
+
const trusted = new Set();
|
|
144
|
+
const rebound = new Set();
|
|
145
|
+
const engineLocals = [];
|
|
146
|
+
const reboundFunction = (node) => {
|
|
147
|
+
if (node.id) {
|
|
148
|
+
rebound.add(node.id.name);
|
|
149
|
+
}
|
|
150
|
+
for (const param of node.params) {
|
|
151
|
+
addPatternNames(param, rebound);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const tags = [];
|
|
155
|
+
const calls = [];
|
|
156
|
+
/** Every class in the file, so a DTO root can be followed through a base class. */
|
|
157
|
+
const classes = [];
|
|
158
|
+
/**
|
|
159
|
+
* One entry per `@column` field in the file. Any expression can call a
|
|
160
|
+
* registered DTO column, so this is what lets calls between a file's own
|
|
161
|
+
* columns resolve. It is filled in `Program:exit` because a declaration
|
|
162
|
+
* carries the `fhirType` of the class it sits in, and a base class may be
|
|
163
|
+
* declared further down the file. The call sites themselves are decided
|
|
164
|
+
* there for the same reason.
|
|
165
|
+
*/
|
|
166
|
+
const columnDeclarations = [];
|
|
167
|
+
const columnFunctions = {};
|
|
168
|
+
const checkAt = (node, expression, site = {}) => {
|
|
169
|
+
// ESLint severity comes from the rule's configuration, not per report, so
|
|
170
|
+
// only error-severity diagnostics are reported; analyzer warnings (style
|
|
171
|
+
// and possible-mistake findings) don't fail a lint run.
|
|
172
|
+
const diagnostics = analyzeSite({
|
|
173
|
+
expression,
|
|
174
|
+
...site,
|
|
175
|
+
// The file's whole column vocabulary, shared by every site in it.
|
|
176
|
+
...(Object.keys(columnFunctions).length > 0 && { functions: columnFunctions }),
|
|
177
|
+
}, {
|
|
178
|
+
model: r4Model,
|
|
179
|
+
...(options.variables !== undefined && { variables: options.variables }),
|
|
180
|
+
...(options.functions !== undefined && { functions: options.functions }),
|
|
181
|
+
});
|
|
182
|
+
for (const diagnostic of diagnostics) {
|
|
183
|
+
if (diagnostic.severity === 'error') {
|
|
184
|
+
context.report({ node, message: `[${diagnostic.code}] ${diagnostic.message}` });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
return {
|
|
189
|
+
ImportDeclaration(node) {
|
|
190
|
+
if (typeof node.source.value !== 'string') {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const names = isForeignModule(node.source.value, options) ? foreign : trusted;
|
|
194
|
+
for (const specifier of node.specifiers) {
|
|
195
|
+
names.add(specifier.local.name);
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
VariableDeclarator(node) {
|
|
199
|
+
if (node.id.type === 'Identifier' &&
|
|
200
|
+
node.init?.type === 'NewExpression' &&
|
|
201
|
+
node.init.callee.type === 'Identifier') {
|
|
202
|
+
engineLocals.push({ localName: node.id.name, className: node.init.callee.name });
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
addPatternNames(node.id, rebound);
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
FunctionDeclaration: reboundFunction,
|
|
209
|
+
FunctionExpression: reboundFunction,
|
|
210
|
+
ArrowFunctionExpression: reboundFunction,
|
|
211
|
+
ClassDeclaration(node) {
|
|
212
|
+
classes.push(heritageOf(node));
|
|
213
|
+
if (node.id) {
|
|
214
|
+
rebound.add(node.id.name);
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
ClassExpression(node) {
|
|
218
|
+
classes.push(heritageOf(node));
|
|
219
|
+
if (node.id) {
|
|
220
|
+
rebound.add(node.id.name);
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
CatchClause(node) {
|
|
224
|
+
if (node.param) {
|
|
225
|
+
addPatternNames(node.param, rebound);
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
TaggedTemplateExpression(node) {
|
|
229
|
+
if (nameOf(node.tag) === TAG_NAME && node.quasi.expressions.length === 0 && node.quasi.quasis[0]) {
|
|
230
|
+
// Report on the template literal, like the call shapes report on their literals.
|
|
231
|
+
tags.push({
|
|
232
|
+
literal: node.quasi,
|
|
233
|
+
expression: node.quasi.quasis[0].value.cooked ?? '',
|
|
234
|
+
receiverRoot: receiverRoot(node.tag),
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
CallExpression(node) {
|
|
239
|
+
const callee = node.callee;
|
|
240
|
+
const name = nameOf(callee);
|
|
241
|
+
const policy = name === undefined ? undefined : CALL_SITES.get(name);
|
|
242
|
+
const argument = policy && node.arguments[policy.argIndex];
|
|
243
|
+
if (name === undefined || policy === undefined || argument === undefined) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
// Only the DTO decorators need to look up: the class they sit in, and the
|
|
247
|
+
// field they decorate.
|
|
248
|
+
const ancestors = policy.rootFromClass === true || policy.declaresField !== undefined
|
|
249
|
+
? context.sourceCode.getAncestors(node)
|
|
250
|
+
: [];
|
|
251
|
+
const declares = policy.declaresField;
|
|
252
|
+
if (declares !== undefined) {
|
|
253
|
+
const field = decoratedFieldName(ancestors);
|
|
254
|
+
if (field !== undefined) {
|
|
255
|
+
columnDeclarations.push({
|
|
256
|
+
kind: declares,
|
|
257
|
+
field,
|
|
258
|
+
options: node.arguments[1],
|
|
259
|
+
enclosing: enclosingClass(ancestors),
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
calls.push({
|
|
264
|
+
policy,
|
|
265
|
+
name,
|
|
266
|
+
receiverRoot: receiverRoot(callee),
|
|
267
|
+
argument,
|
|
268
|
+
node,
|
|
269
|
+
enclosing: policy.rootFromClass === true ? enclosingClass(ancestors) : undefined,
|
|
270
|
+
});
|
|
271
|
+
},
|
|
272
|
+
'Program:exit'() {
|
|
273
|
+
const bindings = { foreign, trusted, rebound };
|
|
274
|
+
// All imports are known now; resolve engine locals in source order, like
|
|
275
|
+
// the CLI walker. A `new` local of some other class is a re-binding.
|
|
276
|
+
for (const { localName, className } of engineLocals) {
|
|
277
|
+
if (constructsEngine(className, bindings)) {
|
|
278
|
+
trusted.add(localName);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
rebound.add(localName);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const dtoRoots = dtoRootsOf(classes);
|
|
285
|
+
// Build the column names first. `checkAt` reads them, and every site in
|
|
286
|
+
// the file shares them, including the tags.
|
|
287
|
+
for (const { kind, field, options: columnOptions, enclosing } of columnDeclarations) {
|
|
288
|
+
columnFunctions[field] = declaredColumnOverloads(columnFunctions[field], columnFunctionDeclaration(kind, columnOptions, estreeAst, rootOf(enclosing, dtoRoots)));
|
|
289
|
+
}
|
|
290
|
+
for (const tag of tags) {
|
|
291
|
+
if (isCheckedTag(tag.receiverRoot, bindings)) {
|
|
292
|
+
checkAt(tag.literal, tag.expression);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
for (const call of calls) {
|
|
296
|
+
if (!isCheckedCall(call.policy, call.name, call.receiverRoot, bindings)) {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const site = siteContext(call.policy, index => call.node.arguments[index], rootOf(call.enclosing, dtoRoots), estreeAst);
|
|
300
|
+
for (const entry of expressionEntries(call.argument, call.policy.shape, estreeAst)) {
|
|
301
|
+
checkAt(entry.node, entry.expression, site);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
const { name: packageName, version: packageVersion } = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
|
|
309
|
+
const plugin = {
|
|
310
|
+
meta: { name: packageName, version: packageVersion },
|
|
311
|
+
rules: {
|
|
312
|
+
'no-invalid-expressions': noInvalidExpressions,
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
export default plugin;
|
|
316
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eslint/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FHIR narrative validation for htmlChecks(): the xhtml must be well formed, use
|
|
3
|
+
* only the elements and attributes the FHIR spec allows in Narrative.div, and
|
|
4
|
+
* carry no active content. (https://hl7.org/fhir/narrative.html)
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateNarrative(xhtml: string): boolean;
|
|
7
|
+
//# sourceMappingURL=html-checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-checks.d.ts","sourceRoot":"","sources":["../../src/fhir/html-checks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0HH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CA2DxD"}
|