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,54 @@
|
|
|
1
|
+
export type TemporalKind = 'date' | 'dateTime' | 'time';
|
|
2
|
+
export type TemporalPrecision = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';
|
|
3
|
+
/**
|
|
4
|
+
* A Date, DateTime, or Time value with partial precision. Components beyond the
|
|
5
|
+
* value's precision are undefined; comparison across precisions is decided by the
|
|
6
|
+
* operators (spec §6.2/§6.4), not here.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Temporal {
|
|
9
|
+
readonly kind: TemporalKind;
|
|
10
|
+
readonly year: number | undefined;
|
|
11
|
+
readonly month: number | undefined;
|
|
12
|
+
readonly day: number | undefined;
|
|
13
|
+
readonly hour: number | undefined;
|
|
14
|
+
readonly minute: number | undefined;
|
|
15
|
+
readonly second: number | undefined;
|
|
16
|
+
/** Fraction-of-second digits as written, e.g. `559` or `5591`; undefined when absent. */
|
|
17
|
+
readonly fraction: string | undefined;
|
|
18
|
+
/** Offset in minutes; 0 for `Z`; undefined when the literal has no timezone. */
|
|
19
|
+
readonly timezoneOffsetMinutes: number | undefined;
|
|
20
|
+
private constructor();
|
|
21
|
+
/** Parse the text of a date literal (`2014-01`) or FHIR date value. */
|
|
22
|
+
static parseDate(text: string): Temporal | undefined;
|
|
23
|
+
/** Parse the text of a dateTime literal (`2014-01-25T14:30:00Z`, `2014T`). */
|
|
24
|
+
static parseDateTime(text: string): Temporal | undefined;
|
|
25
|
+
/** Parse the text of a time literal (`14:30:14.559`). Times have no timezone. */
|
|
26
|
+
static parseTime(text: string): Temporal | undefined;
|
|
27
|
+
/** Build from components with the same range validation as parsing. */
|
|
28
|
+
static fromFields(kind: TemporalKind, fields: {
|
|
29
|
+
year?: number | undefined;
|
|
30
|
+
month?: number | undefined;
|
|
31
|
+
day?: number | undefined;
|
|
32
|
+
hour?: number | undefined;
|
|
33
|
+
minute?: number | undefined;
|
|
34
|
+
second?: number | undefined;
|
|
35
|
+
fraction?: string | undefined;
|
|
36
|
+
timezoneOffsetMinutes?: number | undefined;
|
|
37
|
+
}): Temporal | undefined;
|
|
38
|
+
private static build;
|
|
39
|
+
get precision(): TemporalPrecision;
|
|
40
|
+
private withKind;
|
|
41
|
+
toString(): string;
|
|
42
|
+
/** Literal form including the `@` (and `@T` for times); used when printing values. */
|
|
43
|
+
toLiteralString(): string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Offset added to a FHIRPath year before handing it to `Date.UTC`, which maps
|
|
47
|
+
* years 0–99 to 1900–1999. Shifting by a whole multiple of 400 preserves the
|
|
48
|
+
* proleptic Gregorian leap rule exactly while moving small years out of that
|
|
49
|
+
* remapped range, so date math on years 1–99 stays correct.
|
|
50
|
+
*/
|
|
51
|
+
export declare const GREGORIAN_UTC_YEAR_OFFSET = 400;
|
|
52
|
+
/** Days in a month (1-based), correct across the full FHIRPath year range. */
|
|
53
|
+
export declare function daysInMonth(year: number, month: number): number;
|
|
54
|
+
//# sourceMappingURL=datetime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datetime.d.ts","sourceRoot":"","sources":["../../src/values/datetime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAA;AAEvD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAA;AAMvG;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,gFAAgF;IAChF,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAA;IAElD,OAAO;IAsBP,uEAAuE;IACvE,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAapD,8EAA8E;IAC9E,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAqCxD,iFAAiF;IACjF,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAcpD,uEAAuE;IACvE,MAAM,CAAC,UAAU,CACf,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACxB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC3C,GACA,QAAQ,GAAG,SAAS;IAIvB,OAAO,CAAC,MAAM,CAAC,KAAK;IAqCpB,IAAI,SAAS,IAAI,iBAAiB,CAoBjC;IAED,OAAO,CAAC,QAAQ;IAchB,QAAQ,IAAI,MAAM;IAgClB,sFAAsF;IACtF,eAAe,IAAI,MAAM;CAG1B;AAMD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/D"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
const DATE_PATTERN = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/;
|
|
2
|
+
const TIME_PATTERN = /^(\d{2})(?::(\d{2})(?::(\d{2})(?:\.(\d+))?)?)?$/;
|
|
3
|
+
const TIMEZONE_PATTERN = /(Z|[+-]\d{2}:\d{2})$/;
|
|
4
|
+
/**
|
|
5
|
+
* A Date, DateTime, or Time value with partial precision. Components beyond the
|
|
6
|
+
* value's precision are undefined; comparison across precisions is decided by the
|
|
7
|
+
* operators (spec §6.2/§6.4), not here.
|
|
8
|
+
*/
|
|
9
|
+
export class Temporal {
|
|
10
|
+
kind;
|
|
11
|
+
year;
|
|
12
|
+
month;
|
|
13
|
+
day;
|
|
14
|
+
hour;
|
|
15
|
+
minute;
|
|
16
|
+
second;
|
|
17
|
+
/** Fraction-of-second digits as written, e.g. `559` or `5591`; undefined when absent. */
|
|
18
|
+
fraction;
|
|
19
|
+
/** Offset in minutes; 0 for `Z`; undefined when the literal has no timezone. */
|
|
20
|
+
timezoneOffsetMinutes;
|
|
21
|
+
constructor(fields) {
|
|
22
|
+
this.kind = fields.kind;
|
|
23
|
+
this.year = fields.year;
|
|
24
|
+
this.month = fields.month;
|
|
25
|
+
this.day = fields.day;
|
|
26
|
+
this.hour = fields.hour;
|
|
27
|
+
this.minute = fields.minute;
|
|
28
|
+
this.second = fields.second;
|
|
29
|
+
this.fraction = fields.fraction;
|
|
30
|
+
this.timezoneOffsetMinutes = fields.timezoneOffsetMinutes;
|
|
31
|
+
}
|
|
32
|
+
/** Parse the text of a date literal (`2014-01`) or FHIR date value. */
|
|
33
|
+
static parseDate(text) {
|
|
34
|
+
const match = DATE_PATTERN.exec(text);
|
|
35
|
+
if (!match) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const [, year, month, day] = match;
|
|
39
|
+
return Temporal.build('date', {
|
|
40
|
+
year: Number(year),
|
|
41
|
+
month: optionalNumber(month),
|
|
42
|
+
day: optionalNumber(day),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Parse the text of a dateTime literal (`2014-01-25T14:30:00Z`, `2014T`). */
|
|
46
|
+
static parseDateTime(text) {
|
|
47
|
+
const timeSeparator = text.indexOf('T');
|
|
48
|
+
if (timeSeparator === -1) {
|
|
49
|
+
const dateOnly = Temporal.parseDate(text);
|
|
50
|
+
return dateOnly ? dateOnly.withKind('dateTime') : undefined;
|
|
51
|
+
}
|
|
52
|
+
const datePart = text.slice(0, timeSeparator);
|
|
53
|
+
let timePart = text.slice(timeSeparator + 1);
|
|
54
|
+
const dateMatch = DATE_PATTERN.exec(datePart);
|
|
55
|
+
if (!dateMatch) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
let timezoneOffsetMinutes;
|
|
59
|
+
const timezoneMatch = TIMEZONE_PATTERN.exec(timePart);
|
|
60
|
+
if (timezoneMatch) {
|
|
61
|
+
timezoneOffsetMinutes = parseTimezone(timezoneMatch[1]);
|
|
62
|
+
timePart = timePart.slice(0, -timezoneMatch[1].length);
|
|
63
|
+
}
|
|
64
|
+
let time = null;
|
|
65
|
+
if (timePart !== '') {
|
|
66
|
+
time = TIME_PATTERN.exec(timePart);
|
|
67
|
+
if (!time) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return Temporal.build('dateTime', {
|
|
72
|
+
year: Number(dateMatch[1]),
|
|
73
|
+
month: optionalNumber(dateMatch[2]),
|
|
74
|
+
day: optionalNumber(dateMatch[3]),
|
|
75
|
+
hour: optionalNumber(time?.[1]),
|
|
76
|
+
minute: optionalNumber(time?.[2]),
|
|
77
|
+
second: optionalNumber(time?.[3]),
|
|
78
|
+
fraction: time?.[4],
|
|
79
|
+
timezoneOffsetMinutes,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** Parse the text of a time literal (`14:30:14.559`). Times have no timezone. */
|
|
83
|
+
static parseTime(text) {
|
|
84
|
+
const match = TIME_PATTERN.exec(text);
|
|
85
|
+
if (!match) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
const [, hour, minute, second, fraction] = match;
|
|
89
|
+
return Temporal.build('time', {
|
|
90
|
+
hour: Number(hour),
|
|
91
|
+
minute: optionalNumber(minute),
|
|
92
|
+
second: optionalNumber(second),
|
|
93
|
+
fraction,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** Build from components with the same range validation as parsing. */
|
|
97
|
+
static fromFields(kind, fields) {
|
|
98
|
+
return Temporal.build(kind, fields);
|
|
99
|
+
}
|
|
100
|
+
static build(kind, fields) {
|
|
101
|
+
if (!(inRange(fields.month, 1, 12) &&
|
|
102
|
+
inRange(fields.day, 1, 31) &&
|
|
103
|
+
inRange(fields.hour, 0, 23) &&
|
|
104
|
+
inRange(fields.minute, 0, 59) &&
|
|
105
|
+
inRange(fields.second, 0, 60))) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
// @2019-02-29 is not a date; timezone offsets only exist within -12:00..+14:00.
|
|
109
|
+
if (fields.day !== undefined &&
|
|
110
|
+
fields.month !== undefined &&
|
|
111
|
+
fields.year !== undefined &&
|
|
112
|
+
fields.day > daysInMonth(fields.year, fields.month)) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
if (fields.timezoneOffsetMinutes !== undefined && Math.abs(fields.timezoneOffsetMinutes) > 14 * 60) {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
return new Temporal({ kind, ...fields });
|
|
119
|
+
}
|
|
120
|
+
get precision() {
|
|
121
|
+
if (this.fraction !== undefined) {
|
|
122
|
+
return 'millisecond';
|
|
123
|
+
}
|
|
124
|
+
if (this.second !== undefined) {
|
|
125
|
+
return 'second';
|
|
126
|
+
}
|
|
127
|
+
if (this.minute !== undefined) {
|
|
128
|
+
return 'minute';
|
|
129
|
+
}
|
|
130
|
+
if (this.hour !== undefined) {
|
|
131
|
+
return 'hour';
|
|
132
|
+
}
|
|
133
|
+
if (this.day !== undefined) {
|
|
134
|
+
return 'day';
|
|
135
|
+
}
|
|
136
|
+
if (this.month !== undefined) {
|
|
137
|
+
return 'month';
|
|
138
|
+
}
|
|
139
|
+
return 'year';
|
|
140
|
+
}
|
|
141
|
+
withKind(kind) {
|
|
142
|
+
return new Temporal({
|
|
143
|
+
kind,
|
|
144
|
+
year: this.year,
|
|
145
|
+
month: this.month,
|
|
146
|
+
day: this.day,
|
|
147
|
+
hour: this.hour,
|
|
148
|
+
minute: this.minute,
|
|
149
|
+
second: this.second,
|
|
150
|
+
fraction: this.fraction,
|
|
151
|
+
timezoneOffsetMinutes: this.timezoneOffsetMinutes,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
toString() {
|
|
155
|
+
const parts = [];
|
|
156
|
+
if (this.year !== undefined) {
|
|
157
|
+
parts.push(pad4(this.year));
|
|
158
|
+
if (this.month !== undefined) {
|
|
159
|
+
parts.push(`-${pad2(this.month)}`);
|
|
160
|
+
if (this.day !== undefined) {
|
|
161
|
+
parts.push(`-${pad2(this.day)}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (this.kind === 'dateTime' && this.hour !== undefined) {
|
|
166
|
+
parts.push('T');
|
|
167
|
+
}
|
|
168
|
+
if (this.hour !== undefined) {
|
|
169
|
+
parts.push(pad2(this.hour));
|
|
170
|
+
if (this.minute !== undefined) {
|
|
171
|
+
parts.push(`:${pad2(this.minute)}`);
|
|
172
|
+
if (this.second !== undefined) {
|
|
173
|
+
parts.push(`:${pad2(this.second)}`);
|
|
174
|
+
if (this.fraction !== undefined) {
|
|
175
|
+
parts.push(`.${this.fraction}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (this.timezoneOffsetMinutes !== undefined) {
|
|
180
|
+
parts.push(formatTimezone(this.timezoneOffsetMinutes));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return parts.join('');
|
|
184
|
+
}
|
|
185
|
+
/** Literal form including the `@` (and `@T` for times); used when printing values. */
|
|
186
|
+
toLiteralString() {
|
|
187
|
+
return this.kind === 'time' ? `@T${this.toString()}` : `@${this.toString()}`;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function optionalNumber(text) {
|
|
191
|
+
return text === undefined ? undefined : Number(text);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Offset added to a FHIRPath year before handing it to `Date.UTC`, which maps
|
|
195
|
+
* years 0–99 to 1900–1999. Shifting by a whole multiple of 400 preserves the
|
|
196
|
+
* proleptic Gregorian leap rule exactly while moving small years out of that
|
|
197
|
+
* remapped range, so date math on years 1–99 stays correct.
|
|
198
|
+
*/
|
|
199
|
+
export const GREGORIAN_UTC_YEAR_OFFSET = 400;
|
|
200
|
+
/** Days in a month (1-based), correct across the full FHIRPath year range. */
|
|
201
|
+
export function daysInMonth(year, month) {
|
|
202
|
+
return new Date(Date.UTC(year + GREGORIAN_UTC_YEAR_OFFSET, month, 0)).getUTCDate();
|
|
203
|
+
}
|
|
204
|
+
function inRange(value, min, max) {
|
|
205
|
+
return value === undefined || (value >= min && value <= max);
|
|
206
|
+
}
|
|
207
|
+
function parseTimezone(text) {
|
|
208
|
+
if (text === 'Z') {
|
|
209
|
+
return 0;
|
|
210
|
+
}
|
|
211
|
+
const sign = text.startsWith('-') ? -1 : 1;
|
|
212
|
+
const hours = Number(text.slice(1, 3));
|
|
213
|
+
const minutes = Number(text.slice(4, 6));
|
|
214
|
+
return sign * (hours * 60 + minutes);
|
|
215
|
+
}
|
|
216
|
+
function formatTimezone(offsetMinutes) {
|
|
217
|
+
if (offsetMinutes === 0) {
|
|
218
|
+
return 'Z';
|
|
219
|
+
}
|
|
220
|
+
const sign = offsetMinutes < 0 ? '-' : '+';
|
|
221
|
+
const absolute = Math.abs(offsetMinutes);
|
|
222
|
+
return `${sign}${pad2(Math.floor(absolute / 60))}:${pad2(absolute % 60)}`;
|
|
223
|
+
}
|
|
224
|
+
const pad2 = (value) => String(value).padStart(2, '0');
|
|
225
|
+
const pad4 = (value) => String(value).padStart(4, '0');
|
|
226
|
+
//# sourceMappingURL=datetime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datetime.js","sourceRoot":"","sources":["../../src/values/datetime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact decimal arithmetic on a BigInt mantissa with an explicit scale (count of
|
|
3
|
+
* fraction digits). The scale doubles as the value's precision: `1.10` keeps scale 2,
|
|
4
|
+
* which `precision()` and the boundary functions rely on. No floats are involved in
|
|
5
|
+
* `+ - * / div mod`, comparison, or rounding, so `0.1 + 0.2 = 0.3` holds exactly.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Decimal {
|
|
8
|
+
/** Scaled integer including the sign: `-1.25` is digits `-125n`, scale 2. */
|
|
9
|
+
readonly digits: bigint;
|
|
10
|
+
/** Number of fraction digits; never negative. */
|
|
11
|
+
readonly scale: number;
|
|
12
|
+
constructor(digits: bigint, scale: number);
|
|
13
|
+
/** Parse a decimal string. Accepts exponent notation for values arriving from JSON numbers. */
|
|
14
|
+
static fromString(text: string): Decimal | undefined;
|
|
15
|
+
static fromNumber(value: number): Decimal | undefined;
|
|
16
|
+
static zero(): Decimal;
|
|
17
|
+
isZero(): boolean;
|
|
18
|
+
isNegative(): boolean;
|
|
19
|
+
/** True when the value has no fraction part (trailing fraction zeros count as none). */
|
|
20
|
+
isInteger(): boolean;
|
|
21
|
+
negate(): Decimal;
|
|
22
|
+
abs(): Decimal;
|
|
23
|
+
add(other: Decimal): Decimal;
|
|
24
|
+
subtract(other: Decimal): Decimal;
|
|
25
|
+
multiply(other: Decimal): Decimal;
|
|
26
|
+
/** Division; empty (undefined) when dividing by zero. Result is exact up to 24+ fraction digits, then rounded half away from zero and trimmed. */
|
|
27
|
+
divide(other: Decimal): Decimal | undefined;
|
|
28
|
+
/** Truncated integer division (`div`); empty when dividing by zero. */
|
|
29
|
+
integerDivide(other: Decimal): Decimal | undefined;
|
|
30
|
+
/** Remainder (`mod`) with the sign of the dividend; empty when dividing by zero. */
|
|
31
|
+
modulo(other: Decimal): Decimal | undefined;
|
|
32
|
+
compare(other: Decimal): -1 | 0 | 1;
|
|
33
|
+
/** Numeric equality; trailing zeros do not matter (`0.5 = 0.50`). */
|
|
34
|
+
equals(other: Decimal): boolean;
|
|
35
|
+
/** Round half away from zero to `fractionDigits` fraction digits. */
|
|
36
|
+
round(fractionDigits?: number): Decimal;
|
|
37
|
+
/** Drop the fraction part toward zero. */
|
|
38
|
+
truncate(): Decimal;
|
|
39
|
+
ceiling(): Decimal;
|
|
40
|
+
floor(): Decimal;
|
|
41
|
+
/** Reduce the scale by removing trailing fraction zeros, keeping at least `minScale`. */
|
|
42
|
+
trimTrailingZeros(minScale?: number): Decimal;
|
|
43
|
+
/** Rescale to exactly `scale` fraction digits (padding with zeros or rounding). */
|
|
44
|
+
withScale(scale: number): Decimal;
|
|
45
|
+
toString(): string;
|
|
46
|
+
toNumber(): number;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=decimal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decimal.d.ts","sourceRoot":"","sources":["../../src/values/decimal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,OAAO;IAClB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKzC,+FAA+F;IAC/F,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IA2BpD,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAOrD,MAAM,CAAC,IAAI,IAAI,OAAO;IAItB,MAAM,IAAI,OAAO;IAIjB,UAAU,IAAI,OAAO;IAIrB,wFAAwF;IACxF,SAAS,IAAI,OAAO;IAIpB,MAAM,IAAI,OAAO;IAIjB,GAAG,IAAI,OAAO;IAId,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAK5B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAKjC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIjC,kJAAkJ;IAClJ,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;IAS3C,uEAAuE;IACvE,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;IAQlD,oFAAoF;IACpF,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;IAQ3C,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAQnC,qEAAqE;IACrE,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAI/B,qEAAqE;IACrE,KAAK,CAAC,cAAc,SAAI,GAAG,OAAO;IAQlC,0CAA0C;IAC1C,QAAQ,IAAI,OAAO;IAInB,OAAO,IAAI,OAAO;IAQlB,KAAK,IAAI,OAAO;IAQhB,yFAAyF;IACzF,iBAAiB,CAAC,QAAQ,SAAI,GAAG,OAAO;IAUxC,mFAAmF;IACnF,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOjC,QAAQ,IAAI,MAAM;IAQlB,QAAQ,IAAI,MAAM;CAGnB"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact decimal arithmetic on a BigInt mantissa with an explicit scale (count of
|
|
3
|
+
* fraction digits). The scale doubles as the value's precision: `1.10` keeps scale 2,
|
|
4
|
+
* which `precision()` and the boundary functions rely on. No floats are involved in
|
|
5
|
+
* `+ - * / div mod`, comparison, or rounding, so `0.1 + 0.2 = 0.3` holds exactly.
|
|
6
|
+
*/
|
|
7
|
+
export class Decimal {
|
|
8
|
+
/** Scaled integer including the sign: `-1.25` is digits `-125n`, scale 2. */
|
|
9
|
+
digits;
|
|
10
|
+
/** Number of fraction digits; never negative. */
|
|
11
|
+
scale;
|
|
12
|
+
constructor(digits, scale) {
|
|
13
|
+
this.digits = digits;
|
|
14
|
+
this.scale = scale;
|
|
15
|
+
}
|
|
16
|
+
/** Parse a decimal string. Accepts exponent notation for values arriving from JSON numbers. */
|
|
17
|
+
static fromString(text) {
|
|
18
|
+
const match = /^([+-]?)(\d+)(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/.exec(text.trim());
|
|
19
|
+
if (!match) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const [, sign, whole, fraction = '', exponentText] = match;
|
|
23
|
+
let digits = BigInt(`${whole}${fraction}`);
|
|
24
|
+
if (sign === '-') {
|
|
25
|
+
digits = -digits;
|
|
26
|
+
}
|
|
27
|
+
let scale = fraction.length;
|
|
28
|
+
const exponent = exponentText === undefined ? 0 : Number.parseInt(exponentText, 10);
|
|
29
|
+
// JS numbers never stringify past e±308; a larger exponent can only come from
|
|
30
|
+
// hostile input and would allocate a giant BigInt.
|
|
31
|
+
if (Math.abs(exponent) > 400) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
if (exponent > 0) {
|
|
35
|
+
const shift = Math.min(exponent, scale);
|
|
36
|
+
scale -= shift;
|
|
37
|
+
digits *= 10n ** BigInt(exponent - shift);
|
|
38
|
+
}
|
|
39
|
+
else if (exponent < 0) {
|
|
40
|
+
scale -= exponent;
|
|
41
|
+
}
|
|
42
|
+
return new Decimal(digits, scale);
|
|
43
|
+
}
|
|
44
|
+
static fromNumber(value) {
|
|
45
|
+
if (!Number.isFinite(value)) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
return Decimal.fromString(String(value));
|
|
49
|
+
}
|
|
50
|
+
static zero() {
|
|
51
|
+
return new Decimal(0n, 0);
|
|
52
|
+
}
|
|
53
|
+
isZero() {
|
|
54
|
+
return this.digits === 0n;
|
|
55
|
+
}
|
|
56
|
+
isNegative() {
|
|
57
|
+
return this.digits < 0n;
|
|
58
|
+
}
|
|
59
|
+
/** True when the value has no fraction part (trailing fraction zeros count as none). */
|
|
60
|
+
isInteger() {
|
|
61
|
+
return this.digits % 10n ** BigInt(this.scale) === 0n;
|
|
62
|
+
}
|
|
63
|
+
negate() {
|
|
64
|
+
return new Decimal(-this.digits, this.scale);
|
|
65
|
+
}
|
|
66
|
+
abs() {
|
|
67
|
+
return this.digits < 0n ? this.negate() : this;
|
|
68
|
+
}
|
|
69
|
+
add(other) {
|
|
70
|
+
const [a, b, scale] = alignScales(this, other);
|
|
71
|
+
return new Decimal(a + b, scale);
|
|
72
|
+
}
|
|
73
|
+
subtract(other) {
|
|
74
|
+
const [a, b, scale] = alignScales(this, other);
|
|
75
|
+
return new Decimal(a - b, scale);
|
|
76
|
+
}
|
|
77
|
+
multiply(other) {
|
|
78
|
+
return new Decimal(this.digits * other.digits, this.scale + other.scale);
|
|
79
|
+
}
|
|
80
|
+
/** Division; empty (undefined) when dividing by zero. Result is exact up to 24+ fraction digits, then rounded half away from zero and trimmed. */
|
|
81
|
+
divide(other) {
|
|
82
|
+
if (other.digits === 0n) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
const targetScale = Math.max(this.scale, other.scale, 8) + 16;
|
|
86
|
+
const numerator = this.digits * 10n ** BigInt(targetScale + other.scale - this.scale);
|
|
87
|
+
return new Decimal(divideHalfAwayFromZero(numerator, other.digits), targetScale).trimTrailingZeros();
|
|
88
|
+
}
|
|
89
|
+
/** Truncated integer division (`div`); empty when dividing by zero. */
|
|
90
|
+
integerDivide(other) {
|
|
91
|
+
if (other.digits === 0n) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
const [a, b] = alignScales(this, other);
|
|
95
|
+
return new Decimal(a / b, 0);
|
|
96
|
+
}
|
|
97
|
+
/** Remainder (`mod`) with the sign of the dividend; empty when dividing by zero. */
|
|
98
|
+
modulo(other) {
|
|
99
|
+
if (other.digits === 0n) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
const [a, b, scale] = alignScales(this, other);
|
|
103
|
+
return new Decimal(a % b, scale);
|
|
104
|
+
}
|
|
105
|
+
compare(other) {
|
|
106
|
+
const [a, b] = alignScales(this, other);
|
|
107
|
+
if (a < b) {
|
|
108
|
+
return -1;
|
|
109
|
+
}
|
|
110
|
+
return a > b ? 1 : 0;
|
|
111
|
+
}
|
|
112
|
+
/** Numeric equality; trailing zeros do not matter (`0.5 = 0.50`). */
|
|
113
|
+
equals(other) {
|
|
114
|
+
return this.compare(other) === 0;
|
|
115
|
+
}
|
|
116
|
+
/** Round half away from zero to `fractionDigits` fraction digits. */
|
|
117
|
+
round(fractionDigits = 0) {
|
|
118
|
+
if (fractionDigits >= this.scale) {
|
|
119
|
+
return this;
|
|
120
|
+
}
|
|
121
|
+
const factor = 10n ** BigInt(this.scale - fractionDigits);
|
|
122
|
+
return new Decimal(divideHalfAwayFromZero(this.digits, factor), fractionDigits);
|
|
123
|
+
}
|
|
124
|
+
/** Drop the fraction part toward zero. */
|
|
125
|
+
truncate() {
|
|
126
|
+
return new Decimal(this.digits / 10n ** BigInt(this.scale), 0);
|
|
127
|
+
}
|
|
128
|
+
ceiling() {
|
|
129
|
+
const whole = this.truncate();
|
|
130
|
+
if (this.digits > 0n && !this.isInteger()) {
|
|
131
|
+
return new Decimal(whole.digits + 1n, 0);
|
|
132
|
+
}
|
|
133
|
+
return whole;
|
|
134
|
+
}
|
|
135
|
+
floor() {
|
|
136
|
+
const whole = this.truncate();
|
|
137
|
+
if (this.digits < 0n && !this.isInteger()) {
|
|
138
|
+
return new Decimal(whole.digits - 1n, 0);
|
|
139
|
+
}
|
|
140
|
+
return whole;
|
|
141
|
+
}
|
|
142
|
+
/** Reduce the scale by removing trailing fraction zeros, keeping at least `minScale`. */
|
|
143
|
+
trimTrailingZeros(minScale = 0) {
|
|
144
|
+
let digits = this.digits;
|
|
145
|
+
let scale = this.scale;
|
|
146
|
+
while (scale > minScale && digits % 10n === 0n) {
|
|
147
|
+
digits /= 10n;
|
|
148
|
+
scale -= 1;
|
|
149
|
+
}
|
|
150
|
+
return scale === this.scale ? this : new Decimal(digits, scale);
|
|
151
|
+
}
|
|
152
|
+
/** Rescale to exactly `scale` fraction digits (padding with zeros or rounding). */
|
|
153
|
+
withScale(scale) {
|
|
154
|
+
if (scale <= this.scale) {
|
|
155
|
+
return this.round(scale);
|
|
156
|
+
}
|
|
157
|
+
return new Decimal(this.digits * 10n ** BigInt(scale - this.scale), scale);
|
|
158
|
+
}
|
|
159
|
+
toString() {
|
|
160
|
+
const negative = this.digits < 0n;
|
|
161
|
+
const text = (negative ? -this.digits : this.digits).toString().padStart(this.scale + 1, '0');
|
|
162
|
+
const whole = text.slice(0, text.length - this.scale);
|
|
163
|
+
const fraction = this.scale > 0 ? `.${text.slice(text.length - this.scale)}` : '';
|
|
164
|
+
return `${negative ? '-' : ''}${whole}${fraction}`;
|
|
165
|
+
}
|
|
166
|
+
toNumber() {
|
|
167
|
+
return Number(this.toString());
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function alignScales(a, b) {
|
|
171
|
+
const scale = Math.max(a.scale, b.scale);
|
|
172
|
+
return [a.digits * 10n ** BigInt(scale - a.scale), b.digits * 10n ** BigInt(scale - b.scale), scale];
|
|
173
|
+
}
|
|
174
|
+
function divideHalfAwayFromZero(numerator, denominator) {
|
|
175
|
+
const quotient = numerator / denominator;
|
|
176
|
+
const remainder = numerator % denominator;
|
|
177
|
+
if (remainder === 0n) {
|
|
178
|
+
return quotient;
|
|
179
|
+
}
|
|
180
|
+
const absRemainder = remainder < 0n ? -remainder : remainder;
|
|
181
|
+
const absDenominator = denominator < 0n ? -denominator : denominator;
|
|
182
|
+
if (absRemainder * 2n >= absDenominator) {
|
|
183
|
+
const negativeResult = numerator < 0n !== denominator < 0n;
|
|
184
|
+
return quotient + (negativeResult ? -1n : 1n);
|
|
185
|
+
}
|
|
186
|
+
return quotient;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=decimal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decimal.js","sourceRoot":"","sources":["../../src/values/decimal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Decimal } from './decimal.ts';
|
|
2
|
+
import { type TypedValue } from './typed-value.ts';
|
|
3
|
+
export type NumericKind = 'Integer' | 'Long' | 'Decimal';
|
|
4
|
+
export interface NumericOperand {
|
|
5
|
+
kind: NumericKind;
|
|
6
|
+
value: Decimal;
|
|
7
|
+
}
|
|
8
|
+
export declare const LONG_MIN = -9223372036854775808n;
|
|
9
|
+
export declare const LONG_MAX = 9223372036854775807n;
|
|
10
|
+
/** Read an Integer/Long/Decimal operand as a Decimal, remembering its kind. */
|
|
11
|
+
export declare function asNumeric(item: TypedValue): NumericOperand | undefined;
|
|
12
|
+
/** The wider of two numeric kinds: Decimal > Long > Integer (spec implicit conversion). */
|
|
13
|
+
export declare function widerKind(a: NumericKind, b: NumericKind): NumericKind;
|
|
14
|
+
/**
|
|
15
|
+
* Wrap a numeric result as the narrowest type that represents it exactly.
|
|
16
|
+
* Integer is 32-bit and Long is 64-bit, so their arithmetic can produce a whole
|
|
17
|
+
* number too large for the type. When that happens, widen to the next integer
|
|
18
|
+
* type that holds the value (Integer → Long → Decimal), but never below the
|
|
19
|
+
* operands' own kind. This keeps the value exact rather than dropping it (empty)
|
|
20
|
+
* or wrapping it around the way some engines do. Decimal results pass through
|
|
21
|
+
* unchanged.
|
|
22
|
+
*/
|
|
23
|
+
export declare function wrapNumeric(value: Decimal, kind: NumericKind): TypedValue;
|
|
24
|
+
//# sourceMappingURL=numeric.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric.d.ts","sourceRoot":"","sources":["../../src/values/numeric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAA6D,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7G,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAExD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;CACf;AAID,eAAO,MAAM,QAAQ,wBAAwB,CAAA;AAC7C,eAAO,MAAM,QAAQ,uBAAuB,CAAA;AAE5C,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,SAAS,CAWtE;AAED,2FAA2F;AAC3F,wBAAgB,SAAS,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,WAAW,CAQrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAazE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Decimal } from "./decimal.js";
|
|
2
|
+
import { SYSTEM_DECIMAL, SYSTEM_INTEGER, SYSTEM_LONG, systemTypeOf } from "./typed-value.js";
|
|
3
|
+
const INTEGER_MIN = -2147483648n;
|
|
4
|
+
const INTEGER_MAX = 2147483647n;
|
|
5
|
+
export const LONG_MIN = -9223372036854775808n;
|
|
6
|
+
export const LONG_MAX = 9223372036854775807n;
|
|
7
|
+
/** Read an Integer/Long/Decimal operand as a Decimal, remembering its kind. */
|
|
8
|
+
export function asNumeric(item) {
|
|
9
|
+
switch (systemTypeOf(item)) {
|
|
10
|
+
case SYSTEM_INTEGER:
|
|
11
|
+
return { kind: 'Integer', value: Decimal.fromString(String(item.value)) };
|
|
12
|
+
case SYSTEM_LONG:
|
|
13
|
+
return { kind: 'Long', value: Decimal.fromString(item.value.toString()) };
|
|
14
|
+
case SYSTEM_DECIMAL:
|
|
15
|
+
return { kind: 'Decimal', value: item.value };
|
|
16
|
+
default:
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** The wider of two numeric kinds: Decimal > Long > Integer (spec implicit conversion). */
|
|
21
|
+
export function widerKind(a, b) {
|
|
22
|
+
if (a === 'Decimal' || b === 'Decimal') {
|
|
23
|
+
return 'Decimal';
|
|
24
|
+
}
|
|
25
|
+
if (a === 'Long' || b === 'Long') {
|
|
26
|
+
return 'Long';
|
|
27
|
+
}
|
|
28
|
+
return 'Integer';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Wrap a numeric result as the narrowest type that represents it exactly.
|
|
32
|
+
* Integer is 32-bit and Long is 64-bit, so their arithmetic can produce a whole
|
|
33
|
+
* number too large for the type. When that happens, widen to the next integer
|
|
34
|
+
* type that holds the value (Integer → Long → Decimal), but never below the
|
|
35
|
+
* operands' own kind. This keeps the value exact rather than dropping it (empty)
|
|
36
|
+
* or wrapping it around the way some engines do. Decimal results pass through
|
|
37
|
+
* unchanged.
|
|
38
|
+
*/
|
|
39
|
+
export function wrapNumeric(value, kind) {
|
|
40
|
+
if (kind === 'Decimal') {
|
|
41
|
+
return { type: SYSTEM_DECIMAL, value };
|
|
42
|
+
}
|
|
43
|
+
const whole = value.trimTrailingZeros();
|
|
44
|
+
const big = BigInt(whole.toString());
|
|
45
|
+
if (kind === 'Integer' && big >= INTEGER_MIN && big <= INTEGER_MAX) {
|
|
46
|
+
return { type: SYSTEM_INTEGER, value: Number(big) };
|
|
47
|
+
}
|
|
48
|
+
if (big >= LONG_MIN && big <= LONG_MAX) {
|
|
49
|
+
return { type: SYSTEM_LONG, value: big };
|
|
50
|
+
}
|
|
51
|
+
return { type: SYSTEM_DECIMAL, value: whole };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=numeric.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric.js","sourceRoot":"","sources":["../../src/values/numeric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAA;AAS7G,MAAM,WAAW,GAAG,CAAC,WAAW,CAAA;AAChC,MAAM,WAAW,GAAG,WAAW,CAAA;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,oBAAoB,CAAA;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,oBAAoB,CAAA;AAE5C,+EAA+E;AAC/E,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,QAAQ,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,KAAK,cAAc;YACjB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAY,EAAE,CAAA;QAChG,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAE,IAAI,CAAC,KAAgB,CAAC,QAAQ,EAAE,CAAY,EAAE,CAAA;QAClG,KAAK,cAAc;YACjB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAgB,EAAE,CAAA;QAC1D;YACE,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,SAAS,CAAC,CAAc,EAAE,CAAc;IACtD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QACjC,OAAO,MAAM,CAAA;IACf,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,IAAiB;IAC3D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;IACxC,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAA;IACvC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;IACpC,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QACnE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACrD,CAAC;IACD,IAAI,GAAG,IAAI,QAAQ,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;IAC1C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;AAC/C,CAAC"}
|