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,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static ReDoS heuristic for literal regex arguments of the matches() family.
|
|
3
|
+
* A synchronous JS engine cannot time out a running RegExp, so catastrophic
|
|
4
|
+
* backtracking is flagged before it runs instead: the classic exponential
|
|
5
|
+
* shape is an unbounded quantifier applied to a group that itself contains an
|
|
6
|
+
* unbounded quantifier — `(a+)+`, `(\d*)*`, `(x|y+)*`. That is what this
|
|
7
|
+
* detects; overlapping-alternation cases like `(a|ab)+` are out of scope.
|
|
8
|
+
*/
|
|
9
|
+
export function hasNestedUnboundedQuantifier(pattern) {
|
|
10
|
+
// Each open group tracks whether an unbounded quantifier appeared inside it.
|
|
11
|
+
const groups = [];
|
|
12
|
+
let currentHasUnbounded = false;
|
|
13
|
+
let index = 0;
|
|
14
|
+
while (index < pattern.length) {
|
|
15
|
+
const char = pattern[index];
|
|
16
|
+
if (char === '\\') {
|
|
17
|
+
index += 2;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (char === '[') {
|
|
21
|
+
// Character classes repeat single characters; quantifiers inside are literals.
|
|
22
|
+
index += 1;
|
|
23
|
+
while (index < pattern.length && pattern[index] !== ']') {
|
|
24
|
+
index += pattern[index] === '\\' ? 2 : 1;
|
|
25
|
+
}
|
|
26
|
+
index += 1;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (char === '(') {
|
|
30
|
+
groups.push(currentHasUnbounded);
|
|
31
|
+
currentHasUnbounded = false;
|
|
32
|
+
index += 1;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (char === ')') {
|
|
36
|
+
const groupHadUnbounded = currentHasUnbounded;
|
|
37
|
+
currentHasUnbounded = groups.pop() ?? false;
|
|
38
|
+
index += 1;
|
|
39
|
+
const quantifier = readQuantifier(pattern, index);
|
|
40
|
+
if (quantifier !== undefined) {
|
|
41
|
+
if (groupHadUnbounded && quantifier.unbounded) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
currentHasUnbounded ||= quantifier.unbounded;
|
|
45
|
+
index = quantifier.end;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
currentHasUnbounded ||= groupHadUnbounded;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const quantifier = readQuantifier(pattern, index);
|
|
52
|
+
if (quantifier !== undefined && index > 0) {
|
|
53
|
+
currentHasUnbounded ||= quantifier.unbounded;
|
|
54
|
+
index = quantifier.end;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
index += 1;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
/** The quantifier at `index` (`*`, `+`, `{m,}`, `{m,n}`, with lazy `?`), or undefined. */
|
|
62
|
+
function readQuantifier(pattern, index) {
|
|
63
|
+
const char = pattern[index];
|
|
64
|
+
if (char === '*' || char === '+') {
|
|
65
|
+
return { unbounded: true, end: skipLazy(pattern, index + 1) };
|
|
66
|
+
}
|
|
67
|
+
if (char === '?') {
|
|
68
|
+
return { unbounded: false, end: skipLazy(pattern, index + 1) };
|
|
69
|
+
}
|
|
70
|
+
if (char === '{') {
|
|
71
|
+
const match = /^\{(\d+)(,(\d*)?)?\}/.exec(pattern.slice(index));
|
|
72
|
+
if (match === null) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
// {m} and {m,n} are bounded; {m,} is unbounded.
|
|
76
|
+
const unbounded = match[2] !== undefined && (match[3] === undefined || match[3] === '');
|
|
77
|
+
return { unbounded, end: skipLazy(pattern, index + match[0].length) };
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
function skipLazy(pattern, index) {
|
|
82
|
+
return pattern[index] === '?' ? index + 1 : index;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=regex-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-safety.js","sourceRoot":"","sources":["../../src/analyzer/regex-safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ValueKind } from '../values/type-compat.ts';
|
|
2
|
+
interface StaticStateLike {
|
|
3
|
+
types: string[] | undefined;
|
|
4
|
+
/** True: at most one item. False: may hold several. Undefined: cardinality unknown. */
|
|
5
|
+
single: boolean | undefined;
|
|
6
|
+
/** Canonical resource types a Reference state may point to — resolve()'s result. */
|
|
7
|
+
targets?: string[];
|
|
8
|
+
}
|
|
9
|
+
/** Cardinality of a value combined from two parts: single only when both are. */
|
|
10
|
+
export declare function singleAnd(a: boolean | undefined, b: boolean | undefined): boolean | undefined;
|
|
11
|
+
/** Describes whether an argument is a lambda, condition, sort key, type name, or eager value. */
|
|
12
|
+
export type ArgSpec = 'expression' | 'condition' | 'sort-key' | 'type-name' | 'any' | ValueKind;
|
|
13
|
+
/**
|
|
14
|
+
* The argument shapes a host function can declare. Host functions always
|
|
15
|
+
* receive eagerly evaluated values (HostFunction.fn), so only the eager specs
|
|
16
|
+
* are offered — declaring a lambda spec like `expression` would make the
|
|
17
|
+
* analyzer check semantics the runtime does not implement.
|
|
18
|
+
*/
|
|
19
|
+
export type ValueArgSpec = 'any' | ValueKind;
|
|
20
|
+
/**
|
|
21
|
+
* Accepted focus kind, cardinality, and model types. DTO functions may set
|
|
22
|
+
* `types`; built-ins must not because specification functions accept many types.
|
|
23
|
+
*/
|
|
24
|
+
export interface InputSpec {
|
|
25
|
+
kind?: ValueKind;
|
|
26
|
+
singleton?: boolean;
|
|
27
|
+
/** Canonical or local model type names ('CodeableConcept', 'System.String'). */
|
|
28
|
+
types?: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The declared analyzer signature of a host-supplied function (HAPI's
|
|
32
|
+
* checkFunction): what input it accepts, how its arguments are treated, and
|
|
33
|
+
* what it returns. Result `types` use model or System names ('Patient',
|
|
34
|
+
* 'System.String'); omitting them keeps the result an unknown region.
|
|
35
|
+
*/
|
|
36
|
+
export interface CustomFunctionSignature {
|
|
37
|
+
input?: InputSpec;
|
|
38
|
+
args?: ValueArgSpec[];
|
|
39
|
+
result?: {
|
|
40
|
+
types?: string[];
|
|
41
|
+
single?: boolean;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface FunctionSignature {
|
|
45
|
+
input?: InputSpec;
|
|
46
|
+
args?: ArgSpec[];
|
|
47
|
+
/**
|
|
48
|
+
* Result state from the input state and the analyzed argument states
|
|
49
|
+
* (undefined for `type-name` positions and missing optional arguments).
|
|
50
|
+
*/
|
|
51
|
+
result: (input: StaticStateLike, args: readonly (StaticStateLike | undefined)[]) => StaticStateLike;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The input's candidate types and reference targets at a different cardinality
|
|
55
|
+
* — the composition every selection/projection result goes through, so target
|
|
56
|
+
* metadata survives by construction instead of by per-function special cases.
|
|
57
|
+
*/
|
|
58
|
+
export declare function withSingle(input: StaticStateLike, single: boolean | undefined): StaticStateLike;
|
|
59
|
+
/**
|
|
60
|
+
* The union of several alternative states (iif branches, coalesce arguments,
|
|
61
|
+
* merged collections): all candidate types, single only when every alternative
|
|
62
|
+
* is, and reference targets preserved when every non-empty alternative
|
|
63
|
+
* declares them (a statically empty side contributes nothing).
|
|
64
|
+
*/
|
|
65
|
+
export declare function unionStates(states: (StaticStateLike | undefined)[]): StaticStateLike;
|
|
66
|
+
/**
|
|
67
|
+
* What the analyzer knows about each function. Functions missing here still get
|
|
68
|
+
* arity checks from the runtime registry; their results become unknown.
|
|
69
|
+
*/
|
|
70
|
+
export declare const FUNCTION_SIGNATURES: Readonly<Record<string, FunctionSignature>>;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=signatures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signatures.d.ts","sourceRoot":"","sources":["../../src/analyzer/signatures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEzD,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IAC3B,uFAAuF;IACvF,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;IAC3B,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAK7F;AAED,iGAAiG;AACjG,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,KAAK,GAAG,SAAS,CAAA;AAE/F;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,CAAA;AAE5C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,IAAI,CAAC,EAAE,YAAY,EAAE,CAAA;IACrB,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAChD;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;IAChB;;;OAGG;IACH,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,eAAe,GAAG,SAAS,CAAC,EAAE,KAAK,eAAe,CAAA;CACpG;AASD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,eAAe,CAI/F;AAID;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,CAAC,eAAe,GAAG,SAAS,CAAC,EAAE,GAAG,eAAe,CAapF;AAKD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAqJ3E,CAAA"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/** Cardinality of a value combined from two parts: single only when both are. */
|
|
2
|
+
export function singleAnd(a, b) {
|
|
3
|
+
if (a === false || b === false) {
|
|
4
|
+
return false;
|
|
5
|
+
}
|
|
6
|
+
return a === true && b === true ? true : undefined;
|
|
7
|
+
}
|
|
8
|
+
const BOOLEAN = () => ({ types: ['System.Boolean'], single: true });
|
|
9
|
+
const INTEGER = () => ({ types: ['System.Integer'], single: true });
|
|
10
|
+
const STRING = () => ({ types: ['System.String'], single: true });
|
|
11
|
+
const DECIMAL = () => ({ types: ['System.Decimal'], single: true });
|
|
12
|
+
const UNKNOWN = () => ({ types: undefined, single: undefined });
|
|
13
|
+
const SAME = (input) => input;
|
|
14
|
+
/**
|
|
15
|
+
* The input's candidate types and reference targets at a different cardinality
|
|
16
|
+
* — the composition every selection/projection result goes through, so target
|
|
17
|
+
* metadata survives by construction instead of by per-function special cases.
|
|
18
|
+
*/
|
|
19
|
+
export function withSingle(input, single) {
|
|
20
|
+
return input.targets === undefined
|
|
21
|
+
? { types: input.types, single }
|
|
22
|
+
: { types: input.types, single, targets: input.targets };
|
|
23
|
+
}
|
|
24
|
+
const ITEM = (input) => withSingle(input, true);
|
|
25
|
+
/**
|
|
26
|
+
* The union of several alternative states (iif branches, coalesce arguments,
|
|
27
|
+
* merged collections): all candidate types, single only when every alternative
|
|
28
|
+
* is, and reference targets preserved when every non-empty alternative
|
|
29
|
+
* declares them (a statically empty side contributes nothing).
|
|
30
|
+
*/
|
|
31
|
+
export function unionStates(states) {
|
|
32
|
+
const present = states.filter((state) => state !== undefined);
|
|
33
|
+
const single = present.length > 0 ? present.map(state => state.single).reduce(singleAnd, true) : undefined;
|
|
34
|
+
const contributing = present.filter(state => state.types === undefined || state.types.length > 0);
|
|
35
|
+
const targets = contributing.length > 0 && contributing.every(state => state.targets !== undefined)
|
|
36
|
+
? [...new Set(contributing.flatMap(state => state.targets))]
|
|
37
|
+
: undefined;
|
|
38
|
+
const types = present.length === 0 || present.some(state => state.types === undefined)
|
|
39
|
+
? undefined
|
|
40
|
+
: [...new Set(present.flatMap(state => state.types))];
|
|
41
|
+
return targets === undefined ? { types, single } : { types, single, targets };
|
|
42
|
+
}
|
|
43
|
+
const STRING_FN = { input: { kind: 'String', singleton: true }, args: ['String'], result: STRING };
|
|
44
|
+
const MATH_FN = { input: { kind: 'Numeric', singleton: true }, result: DECIMAL };
|
|
45
|
+
/**
|
|
46
|
+
* What the analyzer knows about each function. Functions missing here still get
|
|
47
|
+
* arity checks from the runtime registry; their results become unknown.
|
|
48
|
+
*/
|
|
49
|
+
export const FUNCTION_SIGNATURES = {
|
|
50
|
+
empty: { result: BOOLEAN },
|
|
51
|
+
exists: { args: ['expression'], result: BOOLEAN },
|
|
52
|
+
all: { args: ['expression'], result: BOOLEAN },
|
|
53
|
+
allTrue: { input: { kind: 'Boolean' }, result: BOOLEAN },
|
|
54
|
+
anyTrue: { input: { kind: 'Boolean' }, result: BOOLEAN },
|
|
55
|
+
allFalse: { input: { kind: 'Boolean' }, result: BOOLEAN },
|
|
56
|
+
anyFalse: { input: { kind: 'Boolean' }, result: BOOLEAN },
|
|
57
|
+
count: { result: INTEGER },
|
|
58
|
+
distinct: { result: SAME },
|
|
59
|
+
isDistinct: { result: BOOLEAN },
|
|
60
|
+
subsetOf: { args: ['any'], result: BOOLEAN },
|
|
61
|
+
supersetOf: { args: ['any'], result: BOOLEAN },
|
|
62
|
+
// Filters cannot grow their input, so cardinality is preserved: filtering a
|
|
63
|
+
// single item yields at most one item.
|
|
64
|
+
where: { args: ['expression'], result: SAME },
|
|
65
|
+
select: {
|
|
66
|
+
args: ['expression'],
|
|
67
|
+
// The projection's analyzed state, collection-ized: single only when both
|
|
68
|
+
// the input and the projection body are single.
|
|
69
|
+
result: (input, args) => withSingle(args[0] ?? UNKNOWN(), singleAnd(input.single, args[0]?.single)),
|
|
70
|
+
},
|
|
71
|
+
repeat: { args: ['expression'], result: UNKNOWN },
|
|
72
|
+
// ofType/as results narrow to the named type; the analyzer computes that with
|
|
73
|
+
// the model (walkCall), so their table results are never consulted.
|
|
74
|
+
ofType: { args: ['type-name'], result: UNKNOWN },
|
|
75
|
+
is: { input: { singleton: true }, args: ['type-name'], result: BOOLEAN },
|
|
76
|
+
as: { input: { singleton: true }, args: ['type-name'], result: UNKNOWN },
|
|
77
|
+
single: { result: ITEM },
|
|
78
|
+
first: { result: ITEM },
|
|
79
|
+
last: { result: ITEM },
|
|
80
|
+
tail: { result: SAME },
|
|
81
|
+
skip: { args: ['Numeric'], result: SAME },
|
|
82
|
+
take: { args: ['Numeric'], result: SAME },
|
|
83
|
+
intersect: { args: ['any'], result: SAME },
|
|
84
|
+
exclude: { args: ['any'], result: SAME },
|
|
85
|
+
union: { args: ['any'], result: (input, args) => withSingle(unionStates([input, args[0]]), false) },
|
|
86
|
+
combine: { args: ['any'], result: (input, args) => withSingle(unionStates([input, args[0]]), false) },
|
|
87
|
+
iif: {
|
|
88
|
+
args: ['condition', 'expression', 'expression'],
|
|
89
|
+
// The union of the branch states; a missing else-branch contributes empty.
|
|
90
|
+
result: (_input, args) => unionStates([args[1], args[2] ?? { types: [], single: true }]),
|
|
91
|
+
},
|
|
92
|
+
// not() takes anything a Boolean test accepts (0/1, single items), so no kind pin.
|
|
93
|
+
not: { input: { singleton: true }, result: BOOLEAN },
|
|
94
|
+
trace: { args: ['String', 'expression'], result: SAME },
|
|
95
|
+
children: { result: UNKNOWN },
|
|
96
|
+
descendants: { result: UNKNOWN },
|
|
97
|
+
// A reference resolves to its declared target types (Reference.targetProfile,
|
|
98
|
+
// HAPI's TypeDetails.targets); an unconstrained reference stays unknown.
|
|
99
|
+
resolve: { result: input => ({ types: input.targets, single: input.single }) },
|
|
100
|
+
extension: { args: ['String'], result: UNKNOWN },
|
|
101
|
+
hasValue: { input: { singleton: true }, result: BOOLEAN },
|
|
102
|
+
getValue: { input: { singleton: true }, result: UNKNOWN },
|
|
103
|
+
htmlChecks: { input: { singleton: true }, result: BOOLEAN },
|
|
104
|
+
comparable: { input: { kind: 'Quantity', singleton: true }, args: ['Quantity'], result: BOOLEAN },
|
|
105
|
+
conformsTo: { input: { singleton: true }, args: ['String'], result: BOOLEAN },
|
|
106
|
+
length: { input: { kind: 'String', singleton: true }, result: INTEGER },
|
|
107
|
+
indexOf: { ...STRING_FN, result: INTEGER },
|
|
108
|
+
lastIndexOf: { ...STRING_FN, result: INTEGER },
|
|
109
|
+
substring: { input: { kind: 'String', singleton: true }, args: ['Numeric', 'Numeric'], result: STRING },
|
|
110
|
+
startsWith: { ...STRING_FN, result: BOOLEAN },
|
|
111
|
+
endsWith: { ...STRING_FN, result: BOOLEAN },
|
|
112
|
+
contains: { ...STRING_FN, result: BOOLEAN },
|
|
113
|
+
upper: { input: { kind: 'String', singleton: true }, result: STRING },
|
|
114
|
+
lower: { input: { kind: 'String', singleton: true }, result: STRING },
|
|
115
|
+
replace: { input: { kind: 'String', singleton: true }, args: ['String', 'String'], result: STRING },
|
|
116
|
+
matches: { ...STRING_FN, result: BOOLEAN },
|
|
117
|
+
matchesFull: { ...STRING_FN, result: BOOLEAN },
|
|
118
|
+
replaceMatches: { input: { kind: 'String', singleton: true }, args: ['String', 'String'], result: STRING },
|
|
119
|
+
toChars: {
|
|
120
|
+
input: { kind: 'String', singleton: true },
|
|
121
|
+
result: () => ({ types: ['System.String'], single: false }),
|
|
122
|
+
},
|
|
123
|
+
trim: { input: { kind: 'String', singleton: true }, result: STRING },
|
|
124
|
+
split: {
|
|
125
|
+
input: { kind: 'String', singleton: true },
|
|
126
|
+
args: ['String'],
|
|
127
|
+
result: () => ({ types: ['System.String'], single: false }),
|
|
128
|
+
},
|
|
129
|
+
join: { input: { kind: 'String' }, args: ['String'], result: STRING },
|
|
130
|
+
encode: STRING_FN,
|
|
131
|
+
decode: STRING_FN,
|
|
132
|
+
escape: STRING_FN,
|
|
133
|
+
unescape: STRING_FN,
|
|
134
|
+
abs: { input: { singleton: true }, result: UNKNOWN },
|
|
135
|
+
ceiling: { input: { kind: 'Numeric', singleton: true }, result: INTEGER },
|
|
136
|
+
floor: { input: { kind: 'Numeric', singleton: true }, result: INTEGER },
|
|
137
|
+
truncate: { input: { kind: 'Numeric', singleton: true }, result: INTEGER },
|
|
138
|
+
round: { input: { kind: 'Numeric', singleton: true }, args: ['Numeric'], result: DECIMAL },
|
|
139
|
+
exp: MATH_FN,
|
|
140
|
+
ln: MATH_FN,
|
|
141
|
+
sqrt: MATH_FN,
|
|
142
|
+
log: { input: { kind: 'Numeric', singleton: true }, args: ['Numeric'], result: DECIMAL },
|
|
143
|
+
power: { input: { kind: 'Numeric', singleton: true }, args: ['Numeric'], result: UNKNOWN },
|
|
144
|
+
aggregate: { args: ['expression', 'any'], result: UNKNOWN },
|
|
145
|
+
sum: { input: { kind: 'Numeric' }, result: UNKNOWN },
|
|
146
|
+
min: { input: { kind: 'Numeric' }, result: UNKNOWN },
|
|
147
|
+
max: { input: { kind: 'Numeric' }, result: UNKNOWN },
|
|
148
|
+
avg: { input: { kind: 'Numeric' }, result: DECIMAL },
|
|
149
|
+
sort: { args: ['sort-key'], result: SAME },
|
|
150
|
+
toBoolean: { input: { singleton: true }, result: BOOLEAN },
|
|
151
|
+
toInteger: { input: { singleton: true }, result: INTEGER },
|
|
152
|
+
toLong: { input: { singleton: true }, result: () => ({ types: ['System.Long'], single: true }) },
|
|
153
|
+
toDecimal: { input: { singleton: true }, result: DECIMAL },
|
|
154
|
+
toString: { input: { singleton: true }, result: STRING },
|
|
155
|
+
toDate: { input: { singleton: true }, result: () => ({ types: ['System.Date'], single: true }) },
|
|
156
|
+
toDateTime: { input: { singleton: true }, result: () => ({ types: ['System.DateTime'], single: true }) },
|
|
157
|
+
toTime: { input: { singleton: true }, result: () => ({ types: ['System.Time'], single: true }) },
|
|
158
|
+
toQuantity: {
|
|
159
|
+
input: { singleton: true },
|
|
160
|
+
args: ['String'],
|
|
161
|
+
result: () => ({ types: ['System.Quantity'], single: true }),
|
|
162
|
+
},
|
|
163
|
+
convertsToBoolean: { input: { singleton: true }, result: BOOLEAN },
|
|
164
|
+
convertsToInteger: { input: { singleton: true }, result: BOOLEAN },
|
|
165
|
+
convertsToLong: { input: { singleton: true }, result: BOOLEAN },
|
|
166
|
+
convertsToDecimal: { input: { singleton: true }, result: BOOLEAN },
|
|
167
|
+
convertsToString: { input: { singleton: true }, result: BOOLEAN },
|
|
168
|
+
convertsToDate: { input: { singleton: true }, result: BOOLEAN },
|
|
169
|
+
convertsToDateTime: { input: { singleton: true }, result: BOOLEAN },
|
|
170
|
+
convertsToTime: { input: { singleton: true }, result: BOOLEAN },
|
|
171
|
+
convertsToQuantity: { input: { singleton: true }, args: ['String'], result: BOOLEAN },
|
|
172
|
+
now: { result: () => ({ types: ['System.DateTime'], single: true }) },
|
|
173
|
+
today: { result: () => ({ types: ['System.Date'], single: true }) },
|
|
174
|
+
timeOfDay: { result: () => ({ types: ['System.Time'], single: true }) },
|
|
175
|
+
yearOf: { input: { kind: 'Temporal', singleton: true }, result: INTEGER },
|
|
176
|
+
monthOf: { input: { kind: 'Temporal', singleton: true }, result: INTEGER },
|
|
177
|
+
dayOf: { input: { kind: 'Temporal', singleton: true }, result: INTEGER },
|
|
178
|
+
hourOf: { input: { kind: 'Temporal', singleton: true }, result: INTEGER },
|
|
179
|
+
minuteOf: { input: { kind: 'Temporal', singleton: true }, result: INTEGER },
|
|
180
|
+
secondOf: { input: { kind: 'Temporal', singleton: true }, result: INTEGER },
|
|
181
|
+
millisecondOf: { input: { kind: 'Temporal', singleton: true }, result: INTEGER },
|
|
182
|
+
timezoneOffsetOf: { input: { kind: 'Temporal', singleton: true }, result: DECIMAL },
|
|
183
|
+
dateOf: { input: { kind: 'Temporal', singleton: true }, result: () => ({ types: ['System.Date'], single: true }) },
|
|
184
|
+
timeOf: { input: { kind: 'Temporal', singleton: true }, result: () => ({ types: ['System.Time'], single: true }) },
|
|
185
|
+
lowBoundary: { input: { singleton: true }, args: ['Numeric'], result: UNKNOWN },
|
|
186
|
+
highBoundary: { input: { singleton: true }, args: ['Numeric'], result: UNKNOWN },
|
|
187
|
+
precision: { input: { singleton: true }, result: INTEGER },
|
|
188
|
+
defineVariable: { args: ['String', 'expression'], result: SAME },
|
|
189
|
+
// Variadic: the analyzer repeats the last arg spec for every position, so one
|
|
190
|
+
// 'expression' entry covers all of coalesce's arguments. The result is the
|
|
191
|
+
// first non-empty argument, hence the union of all of them.
|
|
192
|
+
coalesce: { args: ['expression'], result: (_input, args) => unionStates([...args]) },
|
|
193
|
+
type: { result: UNKNOWN },
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=signatures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signatures.js","sourceRoot":"","sources":["../../src/analyzer/signatures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ModelProvider } from '../model/provider.ts';
|
|
2
|
+
import type { AstNode } from '../parser/ast.ts';
|
|
3
|
+
/** The subset of a FHIR Bundle the engine needs in order to unwrap it. */
|
|
4
|
+
export interface BundleLike {
|
|
5
|
+
resourceType: 'Bundle';
|
|
6
|
+
entry?: {
|
|
7
|
+
resource?: unknown;
|
|
8
|
+
}[];
|
|
9
|
+
}
|
|
10
|
+
export declare function isBundle(value: unknown): value is BundleLike;
|
|
11
|
+
/** One unit of work for the per-resource engine methods (`filter`, `project`, `checkConstraints`). */
|
|
12
|
+
export interface Subject {
|
|
13
|
+
value: unknown;
|
|
14
|
+
/** Position in the input array or in `Bundle.entry`; absent for a single resource. */
|
|
15
|
+
index?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The per-resource view of an engine input: array items, a Bundle's entry
|
|
19
|
+
* resources (original entry positions kept, entries without a resource
|
|
20
|
+
* skipped), or the value itself.
|
|
21
|
+
*/
|
|
22
|
+
export declare function toSubjects(input: unknown): Subject[];
|
|
23
|
+
/**
|
|
24
|
+
* Bundle in, entry resources out — unless the expression addresses the Bundle
|
|
25
|
+
* itself (a `Bundle` root). An expression whose root is a bare Bundle element
|
|
26
|
+
* (`entry.count()`, `type`) could mean either and throws instead of guessing.
|
|
27
|
+
*/
|
|
28
|
+
export declare function normalizeInput(input: unknown, ast: AstNode, model: ModelProvider | undefined): unknown;
|
|
29
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/api/bundle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE/C,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,QAAQ,CAAA;IACtB,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;CACjC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAE5D;AAED,sGAAsG;AACtG,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,OAAO,CAAA;IACd,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,CAUpD;AA0ED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAgBtG"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { FhirPathRuntimeError } from "../errors.js";
|
|
2
|
+
export function isBundle(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && value.resourceType === 'Bundle';
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* The per-resource view of an engine input: array items, a Bundle's entry
|
|
7
|
+
* resources (original entry positions kept, entries without a resource
|
|
8
|
+
* skipped), or the value itself.
|
|
9
|
+
*/
|
|
10
|
+
export function toSubjects(input) {
|
|
11
|
+
if (Array.isArray(input)) {
|
|
12
|
+
return input.map((value, index) => ({ value, index }));
|
|
13
|
+
}
|
|
14
|
+
if (isBundle(input)) {
|
|
15
|
+
return (Array.isArray(input.entry) ? input.entry : [])
|
|
16
|
+
.map((entry, index) => ({ value: entry.resource, index }))
|
|
17
|
+
.filter(subject => subject.value != null);
|
|
18
|
+
}
|
|
19
|
+
return [{ value: input }];
|
|
20
|
+
}
|
|
21
|
+
const rootIdentifiersCache = new WeakMap();
|
|
22
|
+
/** Identifiers in root (path-head) position — the names that resolve against the input. */
|
|
23
|
+
function rootIdentifiers(ast) {
|
|
24
|
+
let heads = rootIdentifiersCache.get(ast);
|
|
25
|
+
if (!heads) {
|
|
26
|
+
const collected = new Set();
|
|
27
|
+
collectRootIdentifiers(ast, collected);
|
|
28
|
+
rootIdentifiersCache.set(ast, collected);
|
|
29
|
+
heads = collected;
|
|
30
|
+
}
|
|
31
|
+
return heads;
|
|
32
|
+
}
|
|
33
|
+
function collectRootIdentifiers(node, heads) {
|
|
34
|
+
switch (node.kind) {
|
|
35
|
+
case 'identifier':
|
|
36
|
+
heads.add(node.name);
|
|
37
|
+
return;
|
|
38
|
+
case 'dot':
|
|
39
|
+
// Only the head of a dotted path is a root; the right side is an element name,
|
|
40
|
+
// and arguments of dotted-in functions resolve against $this, not the input.
|
|
41
|
+
collectRootIdentifiers(node.left, heads);
|
|
42
|
+
return;
|
|
43
|
+
case 'indexer':
|
|
44
|
+
collectRootIdentifiers(node.target, heads);
|
|
45
|
+
collectRootIdentifiers(node.index, heads);
|
|
46
|
+
return;
|
|
47
|
+
case 'call':
|
|
48
|
+
for (const arg of node.args) {
|
|
49
|
+
collectRootIdentifiers(arg, heads);
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
case 'unary':
|
|
53
|
+
collectRootIdentifiers(node.operand, heads);
|
|
54
|
+
return;
|
|
55
|
+
case 'binary':
|
|
56
|
+
collectRootIdentifiers(node.left, heads);
|
|
57
|
+
collectRootIdentifiers(node.right, heads);
|
|
58
|
+
return;
|
|
59
|
+
case 'typeOp':
|
|
60
|
+
collectRootIdentifiers(node.operand, heads);
|
|
61
|
+
return;
|
|
62
|
+
default:
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Bundle element names (R4/R5 plus the Resource base), the fallback when no model is bound. */
|
|
67
|
+
const BUNDLE_ELEMENTS = new Set([
|
|
68
|
+
'id',
|
|
69
|
+
'meta',
|
|
70
|
+
'implicitRules',
|
|
71
|
+
'language',
|
|
72
|
+
'identifier',
|
|
73
|
+
'type',
|
|
74
|
+
'timestamp',
|
|
75
|
+
'total',
|
|
76
|
+
'link',
|
|
77
|
+
'entry',
|
|
78
|
+
'signature',
|
|
79
|
+
'issues',
|
|
80
|
+
]);
|
|
81
|
+
function isBundleElement(name, model) {
|
|
82
|
+
const bundleType = model?.resolveType('Bundle');
|
|
83
|
+
if (model && bundleType !== undefined) {
|
|
84
|
+
return model.getElement(bundleType, name) !== undefined;
|
|
85
|
+
}
|
|
86
|
+
return BUNDLE_ELEMENTS.has(name);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Bundle in, entry resources out — unless the expression addresses the Bundle
|
|
90
|
+
* itself (a `Bundle` root). An expression whose root is a bare Bundle element
|
|
91
|
+
* (`entry.count()`, `type`) could mean either and throws instead of guessing.
|
|
92
|
+
*/
|
|
93
|
+
export function normalizeInput(input, ast, model) {
|
|
94
|
+
if (!isBundle(input)) {
|
|
95
|
+
return input;
|
|
96
|
+
}
|
|
97
|
+
const heads = rootIdentifiers(ast);
|
|
98
|
+
if (heads.has('Bundle')) {
|
|
99
|
+
return input;
|
|
100
|
+
}
|
|
101
|
+
for (const head of heads) {
|
|
102
|
+
if (isBundleElement(head, model)) {
|
|
103
|
+
throw new FhirPathRuntimeError(`Ambiguous expression for a Bundle input: '${head}' is a Bundle element, but a bare Bundle evaluates against its entry resources. Start the expression at Bundle to address the bundle, or wrap the input in an array to treat it as one resource.`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return toSubjects(input).map(subject => subject.value);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/api/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Small LRU built on Map insertion order; get() refreshes recency. */
|
|
2
|
+
export declare class LruCache<V> {
|
|
3
|
+
private readonly capacity;
|
|
4
|
+
private readonly entries;
|
|
5
|
+
constructor(capacity: number);
|
|
6
|
+
get(key: string): V | undefined;
|
|
7
|
+
set(key: string, value: V): void;
|
|
8
|
+
get size(): number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/api/cache.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,QAAQ,EAAE,MAAM;IAO5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAS/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAehC,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Small LRU built on Map insertion order; get() refreshes recency. */
|
|
2
|
+
export class LruCache {
|
|
3
|
+
capacity;
|
|
4
|
+
entries = new Map();
|
|
5
|
+
constructor(capacity) {
|
|
6
|
+
if (!Number.isInteger(capacity) || capacity < 0) {
|
|
7
|
+
throw new RangeError(`LruCache capacity must be a non-negative integer, got ${capacity}`);
|
|
8
|
+
}
|
|
9
|
+
this.capacity = capacity;
|
|
10
|
+
}
|
|
11
|
+
get(key) {
|
|
12
|
+
const value = this.entries.get(key);
|
|
13
|
+
if (value !== undefined) {
|
|
14
|
+
this.entries.delete(key);
|
|
15
|
+
this.entries.set(key, value);
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
set(key, value) {
|
|
20
|
+
if (this.capacity === 0) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (this.entries.has(key)) {
|
|
24
|
+
this.entries.delete(key);
|
|
25
|
+
}
|
|
26
|
+
else if (this.entries.size >= this.capacity) {
|
|
27
|
+
const oldest = this.entries.keys().next().value;
|
|
28
|
+
if (oldest !== undefined) {
|
|
29
|
+
this.entries.delete(oldest);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
this.entries.set(key, value);
|
|
33
|
+
}
|
|
34
|
+
get size() {
|
|
35
|
+
return this.entries.size;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/api/cache.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,OAAO,QAAQ;IACF,QAAQ,CAAQ;IAChB,OAAO,GAAG,IAAI,GAAG,EAAa,CAAA;IAE/C,YAAY,QAAgB;QAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,UAAU,CAAC,yDAAyD,QAAQ,EAAE,CAAC,CAAA;QAC3F,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC9B,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAQ;QACvB,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACxB,OAAM;QACR,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;YAC/C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IAC1B,CAAC;CACF"}
|