@versionzero/schema 1.0.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 +177 -0
- package/README.md +246 -0
- package/package.json +84 -0
- package/src/compilation/handler-compilation.js +28 -0
- package/src/compilation/metadata-compilation.js +35 -0
- package/src/compilation/schema-compilation.js +142 -0
- package/src/compilation/selection-compilation.js +84 -0
- package/src/compilation/union-compilation.js +510 -0
- package/src/compilation/values-compilation.js +35 -0
- package/src/compiled-schema.js +1709 -0
- package/src/constants.js +1 -0
- package/src/core-library/index.js +32 -0
- package/src/core-library/processors/aggregation-operators.js +75 -0
- package/src/core-library/processors/alpha-constraint.js +20 -0
- package/src/core-library/processors/alphanum-constraint.js +20 -0
- package/src/core-library/processors/array-operator.js +51 -0
- package/src/core-library/processors/assert-constraint.js +75 -0
- package/src/core-library/processors/base64-constraint.js +26 -0
- package/src/core-library/processors/camel-case-operator.js +24 -0
- package/src/core-library/processors/capitalize-operator.js +16 -0
- package/src/core-library/processors/cardnum-constraint.js +193 -0
- package/src/core-library/processors/ceil-operator.js +44 -0
- package/src/core-library/processors/collapse-operator.js +29 -0
- package/src/core-library/processors/compact-operator.js +34 -0
- package/src/core-library/processors/compile-operator.js +65 -0
- package/src/core-library/processors/concat-operator.js +51 -0
- package/src/core-library/processors/conditional-operators.js +301 -0
- package/src/core-library/processors/constant-case-operator.js +16 -0
- package/src/core-library/processors/data-size-operator.js +86 -0
- package/src/core-library/processors/date-object-operator.js +54 -0
- package/src/core-library/processors/date-operator.js +67 -0
- package/src/core-library/processors/date-range-constraint.js +76 -0
- package/src/core-library/processors/defined-constraint.js +30 -0
- package/src/core-library/processors/each-operator.js +57 -0
- package/src/core-library/processors/email-constraint.js +112 -0
- package/src/core-library/processors/entries-operator.js +25 -0
- package/src/core-library/processors/eq-constraint.js +37 -0
- package/src/core-library/processors/filter-operator.js +74 -0
- package/src/core-library/processors/find-schema-operator.js +45 -0
- package/src/core-library/processors/flatten-operator.js +40 -0
- package/src/core-library/processors/floor-operator.js +47 -0
- package/src/core-library/processors/get-operator.js +44 -0
- package/src/core-library/processors/group-by-operator.js +84 -0
- package/src/core-library/processors/has-prefix-constraint.js +37 -0
- package/src/core-library/processors/has-suffix-constraint.js +35 -0
- package/src/core-library/processors/hex-constraint.js +20 -0
- package/src/core-library/processors/hostname-constraint.js +22 -0
- package/src/core-library/processors/http-url-constraint.js +27 -0
- package/src/core-library/processors/in-constraint.js +66 -0
- package/src/core-library/processors/index-by-operator.js +98 -0
- package/src/core-library/processors/index.js +131 -0
- package/src/core-library/processors/input-operator.js +23 -0
- package/src/core-library/processors/instanceof-constraint.js +38 -0
- package/src/core-library/processors/integer-constraint.js +22 -0
- package/src/core-library/processors/invoke-operator.js +33 -0
- package/src/core-library/processors/ipv4-constraint.js +188 -0
- package/src/core-library/processors/ipv6-constraint.js +205 -0
- package/src/core-library/processors/is-array-constraint.js +21 -0
- package/src/core-library/processors/is-date-constraint.js +22 -0
- package/src/core-library/processors/is-number-constraint.js +21 -0
- package/src/core-library/processors/is-object-constraint.js +21 -0
- package/src/core-library/processors/is-string-constraint.js +21 -0
- package/src/core-library/processors/join-operator.js +41 -0
- package/src/core-library/processors/json-constraint.js +22 -0
- package/src/core-library/processors/json-decode-operator.js +25 -0
- package/src/core-library/processors/json-encode-operator.js +35 -0
- package/src/core-library/processors/kebab-case-operator.js +23 -0
- package/src/core-library/processors/keys-operator.js +20 -0
- package/src/core-library/processors/length-constraint.js +85 -0
- package/src/core-library/processors/lookup-operator.js +84 -0
- package/src/core-library/processors/lowercase-operator.js +14 -0
- package/src/core-library/processors/map-operator.js +84 -0
- package/src/core-library/processors/match-operator.js +64 -0
- package/src/core-library/processors/matches-constraint.js +54 -0
- package/src/core-library/processors/math-operators.js +151 -0
- package/src/core-library/processors/merge-deep-operator.js +61 -0
- package/src/core-library/processors/merge-operator.js +54 -0
- package/src/core-library/processors/metadata-operator.js +100 -0
- package/src/core-library/processors/negative-constraint.js +23 -0
- package/src/core-library/processors/never-constraint.js +69 -0
- package/src/core-library/processors/non-empty-constraint.js +59 -0
- package/src/core-library/processors/not-constraint.js +71 -0
- package/src/core-library/processors/number-operator.js +24 -0
- package/src/core-library/processors/numeric-constraint.js +22 -0
- package/src/core-library/processors/object-operator.js +38 -0
- package/src/core-library/processors/omit-operator.js +57 -0
- package/src/core-library/processors/parallel-operator.js +64 -0
- package/src/core-library/processors/pascal-case-operator.js +16 -0
- package/src/core-library/processors/phone-constraint.js +235 -0
- package/src/core-library/processors/pick-operator.js +62 -0
- package/src/core-library/processors/pipeline-operator.js +63 -0
- package/src/core-library/processors/port-constraint.js +22 -0
- package/src/core-library/processors/positive-constraint.js +23 -0
- package/src/core-library/processors/process-operator.js +55 -0
- package/src/core-library/processors/property-operator.js +49 -0
- package/src/core-library/processors/range-constraint.js +72 -0
- package/src/core-library/processors/reference-operator.js +79 -0
- package/src/core-library/processors/require-constraint.js +74 -0
- package/src/core-library/processors/reverse-operator.js +20 -0
- package/src/core-library/processors/round-operator.js +53 -0
- package/src/core-library/processors/schema-handler-operators.js +54 -0
- package/src/core-library/processors/semver-constraint.js +282 -0
- package/src/core-library/processors/sequence-processors.js +406 -0
- package/src/core-library/processors/sort-operator.js +52 -0
- package/src/core-library/processors/split-operator.js +43 -0
- package/src/core-library/processors/string-extra-operators.js +141 -0
- package/src/core-library/processors/string-operator.js +34 -0
- package/src/core-library/processors/target-operator.js +30 -0
- package/src/core-library/processors/template-operator.js +60 -0
- package/src/core-library/processors/title-case-operator.js +17 -0
- package/src/core-library/processors/trim-operator.js +14 -0
- package/src/core-library/processors/truthy-constraint.js +35 -0
- package/src/core-library/processors/type-operator.js +24 -0
- package/src/core-library/processors/unique-operator.js +21 -0
- package/src/core-library/processors/uppercase-operator.js +14 -0
- package/src/core-library/processors/url-constraint.js +31 -0
- package/src/core-library/processors/url-decode-operator.js +50 -0
- package/src/core-library/processors/url-encode-operator.js +44 -0
- package/src/core-library/processors/uuid-constraint.js +31 -0
- package/src/core-library/processors/values-operator.js +20 -0
- package/src/core-library/schemas/any-schema.js +23 -0
- package/src/core-library/schemas/array-schema.js +8 -0
- package/src/core-library/schemas/boolean-schema.js +10 -0
- package/src/core-library/schemas/date-schema.js +12 -0
- package/src/core-library/schemas/function-schema.js +40 -0
- package/src/core-library/schemas/number-schema.js +9 -0
- package/src/core-library/schemas/object-schema.js +10 -0
- package/src/core-library/schemas/root-schema.js +21 -0
- package/src/core-library/schemas/string-schema.js +9 -0
- package/src/core-library-node/index.js +47 -0
- package/src/core-library-node/processors/base64-decode-operator.js +20 -0
- package/src/core-library-node/processors/base64-encode-operator.js +20 -0
- package/src/core-library-node/processors/buffer-operator.js +39 -0
- package/src/core-library-node/processors/directory-constraint.js +35 -0
- package/src/core-library-node/processors/executable-constraint.js +34 -0
- package/src/core-library-node/processors/file-constraint.js +34 -0
- package/src/core-library-node/processors/file-size-constraint.js +94 -0
- package/src/core-library-node/processors/is-buffer-constraint.js +21 -0
- package/src/core-library-node/processors/reachable-constraint.js +28 -0
- package/src/core-library-node/processors/readable-constraint.js +34 -0
- package/src/core-library-node/processors/writable-constraint.js +59 -0
- package/src/core-library-node/schemas/buffer-schema.js +10 -0
- package/src/errors.js +209 -0
- package/src/executor/array-executor.js +78 -0
- package/src/executor/conditional-executor.js +134 -0
- package/src/executor/each-executor.js +68 -0
- package/src/executor/executor.js +123 -0
- package/src/executor/object-executor.js +98 -0
- package/src/executor/parallel-executor.js +43 -0
- package/src/executor/pipeline-executor.js +65 -0
- package/src/executor/sequence-executor.js +206 -0
- package/src/executor/serial-executor.js +24 -0
- package/src/executor/step-executor.js +68 -0
- package/src/helpers/case.js +124 -0
- package/src/helpers/data-size.js +144 -0
- package/src/helpers/debug-sink.js +15 -0
- package/src/helpers/deep.js +280 -0
- package/src/helpers/format.js +121 -0
- package/src/helpers/has-string-properties.js +30 -0
- package/src/helpers/index.js +16 -0
- package/src/helpers/object.js +115 -0
- package/src/helpers/parse-date.js +75 -0
- package/src/helpers/path.js +28 -0
- package/src/helpers/regex.js +18 -0
- package/src/helpers/stringify.js +309 -0
- package/src/helpers/to-data.js +64 -0
- package/src/helpers/truthy.js +55 -0
- package/src/index.js +29 -0
- package/src/schema-compiler.js +531 -0
- package/src/schema-location.js +200 -0
- package/src/schema-resolver.js +546 -0
- package/src/schema.js +1182 -0
- package/src/traversal/executors/check-condition.js +42 -0
- package/src/traversal/executors/check-input.js +27 -0
- package/src/traversal/executors/check-required.js +19 -0
- package/src/traversal/executors/check-schema.js +45 -0
- package/src/traversal/executors/defaults.js +21 -0
- package/src/traversal/executors/enter-existing.js +25 -0
- package/src/traversal/executors/enter-input.js +25 -0
- package/src/traversal/executors/enter.js +37 -0
- package/src/traversal/executors/exit.js +74 -0
- package/src/traversal/executors/finalize.js +64 -0
- package/src/traversal/executors/index.js +42 -0
- package/src/traversal/executors/normalize.js +38 -0
- package/src/traversal/executors/prepare-existing.js +27 -0
- package/src/traversal/executors/prepare-pending.js +54 -0
- package/src/traversal/executors/resolve-union.js +50 -0
- package/src/traversal/executors/serialize.js +48 -0
- package/src/traversal/executors/transform-early.js +51 -0
- package/src/traversal/executors/transform.js +68 -0
- package/src/traversal/executors/traversal-state-executor.js +46 -0
- package/src/traversal/executors/validate.js +63 -0
- package/src/traversal/traversal-context.js +231 -0
- package/src/traversal/traversal-state.js +809 -0
- package/src/types.js +102 -0
- package/src/value-processor/composed-value-processor.js +43 -0
- package/src/value-processor/defined-value-processor.js +72 -0
- package/src/value-processor/function-value-processor.js +68 -0
- package/src/value-processor/parameterized-value-processor.js +45 -0
- package/src/value-processor/parameters-value-processor.js +178 -0
- package/src/value-processor/spec.js +89 -0
- package/src/value-processor/value-processor.js +105 -0
- package/types/compilation/handler-compilation.d.ts +13 -0
- package/types/compilation/metadata-compilation.d.ts +6 -0
- package/types/compilation/schema-compilation.d.ts +32 -0
- package/types/compilation/selection-compilation.d.ts +9 -0
- package/types/compilation/union-compilation.d.ts +42 -0
- package/types/compilation/values-compilation.d.ts +12 -0
- package/types/compiled-schema.d.ts +883 -0
- package/types/constants.d.ts +1 -0
- package/types/core-library/index.d.ts +7 -0
- package/types/core-library/processors/aggregation-operators.d.ts +24 -0
- package/types/core-library/processors/alpha-constraint.d.ts +9 -0
- package/types/core-library/processors/alphanum-constraint.d.ts +9 -0
- package/types/core-library/processors/array-operator.d.ts +12 -0
- package/types/core-library/processors/assert-constraint.d.ts +30 -0
- package/types/core-library/processors/base64-constraint.d.ts +11 -0
- package/types/core-library/processors/camel-case-operator.d.ts +17 -0
- package/types/core-library/processors/capitalize-operator.d.ts +11 -0
- package/types/core-library/processors/cardnum-constraint.d.ts +51 -0
- package/types/core-library/processors/ceil-operator.d.ts +30 -0
- package/types/core-library/processors/collapse-operator.d.ts +24 -0
- package/types/core-library/processors/compact-operator.d.ts +29 -0
- package/types/core-library/processors/compile-operator.d.ts +34 -0
- package/types/core-library/processors/concat-operator.d.ts +23 -0
- package/types/core-library/processors/conditional-operators.d.ts +219 -0
- package/types/core-library/processors/constant-case-operator.d.ts +9 -0
- package/types/core-library/processors/data-size-operator.d.ts +31 -0
- package/types/core-library/processors/date-object-operator.d.ts +16 -0
- package/types/core-library/processors/date-operator.d.ts +21 -0
- package/types/core-library/processors/date-range-constraint.d.ts +26 -0
- package/types/core-library/processors/defined-constraint.d.ts +20 -0
- package/types/core-library/processors/each-operator.d.ts +34 -0
- package/types/core-library/processors/email-constraint.d.ts +54 -0
- package/types/core-library/processors/entries-operator.d.ts +13 -0
- package/types/core-library/processors/eq-constraint.d.ts +20 -0
- package/types/core-library/processors/filter-operator.d.ts +35 -0
- package/types/core-library/processors/find-schema-operator.d.ts +28 -0
- package/types/core-library/processors/flatten-operator.d.ts +26 -0
- package/types/core-library/processors/floor-operator.d.ts +33 -0
- package/types/core-library/processors/get-operator.d.ts +31 -0
- package/types/core-library/processors/group-by-operator.d.ts +36 -0
- package/types/core-library/processors/has-prefix-constraint.d.ts +22 -0
- package/types/core-library/processors/has-suffix-constraint.d.ts +20 -0
- package/types/core-library/processors/hex-constraint.d.ts +9 -0
- package/types/core-library/processors/hostname-constraint.d.ts +11 -0
- package/types/core-library/processors/http-url-constraint.d.ts +9 -0
- package/types/core-library/processors/in-constraint.d.ts +27 -0
- package/types/core-library/processors/index-by-operator.d.ts +26 -0
- package/types/core-library/processors/index.d.ts +8 -0
- package/types/core-library/processors/input-operator.d.ts +20 -0
- package/types/core-library/processors/instanceof-constraint.d.ts +23 -0
- package/types/core-library/processors/integer-constraint.d.ts +9 -0
- package/types/core-library/processors/invoke-operator.d.ts +12 -0
- package/types/core-library/processors/ipv4-constraint.d.ts +37 -0
- package/types/core-library/processors/ipv6-constraint.d.ts +34 -0
- package/types/core-library/processors/is-array-constraint.d.ts +10 -0
- package/types/core-library/processors/is-date-constraint.d.ts +10 -0
- package/types/core-library/processors/is-number-constraint.d.ts +10 -0
- package/types/core-library/processors/is-object-constraint.d.ts +10 -0
- package/types/core-library/processors/is-string-constraint.d.ts +10 -0
- package/types/core-library/processors/join-operator.d.ts +29 -0
- package/types/core-library/processors/json-constraint.d.ts +10 -0
- package/types/core-library/processors/json-decode-operator.d.ts +9 -0
- package/types/core-library/processors/json-encode-operator.d.ts +27 -0
- package/types/core-library/processors/kebab-case-operator.d.ts +16 -0
- package/types/core-library/processors/keys-operator.d.ts +9 -0
- package/types/core-library/processors/length-constraint.d.ts +34 -0
- package/types/core-library/processors/lookup-operator.d.ts +36 -0
- package/types/core-library/processors/lowercase-operator.d.ts +9 -0
- package/types/core-library/processors/map-operator.d.ts +38 -0
- package/types/core-library/processors/match-operator.d.ts +34 -0
- package/types/core-library/processors/matches-constraint.d.ts +29 -0
- package/types/core-library/processors/math-operators.d.ts +91 -0
- package/types/core-library/processors/merge-deep-operator.d.ts +32 -0
- package/types/core-library/processors/merge-operator.d.ts +26 -0
- package/types/core-library/processors/metadata-operator.d.ts +56 -0
- package/types/core-library/processors/negative-constraint.d.ts +13 -0
- package/types/core-library/processors/never-constraint.d.ts +26 -0
- package/types/core-library/processors/non-empty-constraint.d.ts +28 -0
- package/types/core-library/processors/not-constraint.d.ts +28 -0
- package/types/core-library/processors/number-operator.d.ts +9 -0
- package/types/core-library/processors/numeric-constraint.d.ts +10 -0
- package/types/core-library/processors/object-operator.d.ts +10 -0
- package/types/core-library/processors/omit-operator.d.ts +24 -0
- package/types/core-library/processors/parallel-operator.d.ts +41 -0
- package/types/core-library/processors/pascal-case-operator.d.ts +9 -0
- package/types/core-library/processors/phone-constraint.d.ts +65 -0
- package/types/core-library/processors/pick-operator.d.ts +27 -0
- package/types/core-library/processors/pipeline-operator.d.ts +40 -0
- package/types/core-library/processors/port-constraint.d.ts +11 -0
- package/types/core-library/processors/positive-constraint.d.ts +13 -0
- package/types/core-library/processors/process-operator.d.ts +37 -0
- package/types/core-library/processors/property-operator.d.ts +34 -0
- package/types/core-library/processors/range-constraint.d.ts +30 -0
- package/types/core-library/processors/reference-operator.d.ts +38 -0
- package/types/core-library/processors/require-constraint.d.ts +29 -0
- package/types/core-library/processors/reverse-operator.d.ts +9 -0
- package/types/core-library/processors/round-operator.d.ts +34 -0
- package/types/core-library/processors/schema-handler-operators.d.ts +28 -0
- package/types/core-library/processors/semver-constraint.d.ts +43 -0
- package/types/core-library/processors/sequence-processors.d.ts +213 -0
- package/types/core-library/processors/sort-operator.d.ts +31 -0
- package/types/core-library/processors/split-operator.d.ts +33 -0
- package/types/core-library/processors/string-extra-operators.d.ts +83 -0
- package/types/core-library/processors/string-operator.d.ts +10 -0
- package/types/core-library/processors/target-operator.d.ts +27 -0
- package/types/core-library/processors/template-operator.d.ts +31 -0
- package/types/core-library/processors/title-case-operator.d.ts +12 -0
- package/types/core-library/processors/trim-operator.d.ts +9 -0
- package/types/core-library/processors/truthy-constraint.d.ts +23 -0
- package/types/core-library/processors/type-operator.d.ts +11 -0
- package/types/core-library/processors/unique-operator.d.ts +10 -0
- package/types/core-library/processors/uppercase-operator.d.ts +9 -0
- package/types/core-library/processors/url-constraint.d.ts +20 -0
- package/types/core-library/processors/url-decode-operator.d.ts +31 -0
- package/types/core-library/processors/url-encode-operator.d.ts +36 -0
- package/types/core-library/processors/uuid-constraint.d.ts +20 -0
- package/types/core-library/processors/values-operator.d.ts +9 -0
- package/types/core-library/schemas/any-schema.d.ts +2 -0
- package/types/core-library/schemas/array-schema.d.ts +2 -0
- package/types/core-library/schemas/boolean-schema.d.ts +2 -0
- package/types/core-library/schemas/date-schema.d.ts +2 -0
- package/types/core-library/schemas/function-schema.d.ts +2 -0
- package/types/core-library/schemas/number-schema.d.ts +2 -0
- package/types/core-library/schemas/object-schema.d.ts +2 -0
- package/types/core-library/schemas/root-schema.d.ts +2 -0
- package/types/core-library/schemas/string-schema.d.ts +2 -0
- package/types/core-library-node/index.d.ts +12 -0
- package/types/core-library-node/processors/base64-decode-operator.d.ts +9 -0
- package/types/core-library-node/processors/base64-encode-operator.d.ts +9 -0
- package/types/core-library-node/processors/buffer-operator.d.ts +15 -0
- package/types/core-library-node/processors/directory-constraint.d.ts +14 -0
- package/types/core-library-node/processors/executable-constraint.d.ts +17 -0
- package/types/core-library-node/processors/file-constraint.d.ts +13 -0
- package/types/core-library-node/processors/file-size-constraint.d.ts +43 -0
- package/types/core-library-node/processors/is-buffer-constraint.d.ts +10 -0
- package/types/core-library-node/processors/reachable-constraint.d.ts +13 -0
- package/types/core-library-node/processors/readable-constraint.d.ts +17 -0
- package/types/core-library-node/processors/writable-constraint.d.ts +18 -0
- package/types/core-library-node/schemas/buffer-schema.d.ts +2 -0
- package/types/errors.d.ts +58 -0
- package/types/executor/array-executor.d.ts +17 -0
- package/types/executor/conditional-executor.d.ts +45 -0
- package/types/executor/each-executor.d.ts +15 -0
- package/types/executor/executor.d.ts +84 -0
- package/types/executor/object-executor.d.ts +14 -0
- package/types/executor/parallel-executor.d.ts +27 -0
- package/types/executor/pipeline-executor.d.ts +11 -0
- package/types/executor/sequence-executor.d.ts +32 -0
- package/types/executor/serial-executor.d.ts +16 -0
- package/types/executor/step-executor.d.ts +14 -0
- package/types/helpers/case.d.ts +30 -0
- package/types/helpers/data-size.d.ts +25 -0
- package/types/helpers/debug-sink.d.ts +9 -0
- package/types/helpers/deep.d.ts +33 -0
- package/types/helpers/format.d.ts +14 -0
- package/types/helpers/has-string-properties.d.ts +5 -0
- package/types/helpers/index.d.ts +13 -0
- package/types/helpers/object.d.ts +46 -0
- package/types/helpers/parse-date.d.ts +6 -0
- package/types/helpers/path.d.ts +13 -0
- package/types/helpers/regex.d.ts +7 -0
- package/types/helpers/stringify.d.ts +33 -0
- package/types/helpers/to-data.d.ts +13 -0
- package/types/helpers/truthy.d.ts +26 -0
- package/types/index.d.ts +6 -0
- package/types/schema-compiler.d.ts +49 -0
- package/types/schema-location.d.ts +64 -0
- package/types/schema-resolver.d.ts +145 -0
- package/types/schema.d.ts +586 -0
- package/types/traversal/executors/check-condition.d.ts +8 -0
- package/types/traversal/executors/check-input.d.ts +6 -0
- package/types/traversal/executors/check-required.d.ts +6 -0
- package/types/traversal/executors/check-schema.d.ts +7 -0
- package/types/traversal/executors/defaults.d.ts +8 -0
- package/types/traversal/executors/enter-existing.d.ts +6 -0
- package/types/traversal/executors/enter-input.d.ts +8 -0
- package/types/traversal/executors/enter.d.ts +7 -0
- package/types/traversal/executors/exit.d.ts +6 -0
- package/types/traversal/executors/finalize.d.ts +6 -0
- package/types/traversal/executors/index.d.ts +15 -0
- package/types/traversal/executors/normalize.d.ts +7 -0
- package/types/traversal/executors/prepare-existing.d.ts +6 -0
- package/types/traversal/executors/prepare-pending.d.ts +6 -0
- package/types/traversal/executors/resolve-union.d.ts +6 -0
- package/types/traversal/executors/serialize.d.ts +11 -0
- package/types/traversal/executors/transform-early.d.ts +6 -0
- package/types/traversal/executors/transform.d.ts +6 -0
- package/types/traversal/executors/traversal-state-executor.d.ts +19 -0
- package/types/traversal/executors/validate.d.ts +6 -0
- package/types/traversal/traversal-context.d.ts +67 -0
- package/types/traversal/traversal-state.d.ts +97 -0
- package/types/types.d.ts +218 -0
- package/types/value-processor/composed-value-processor.d.ts +17 -0
- package/types/value-processor/defined-value-processor.d.ts +16 -0
- package/types/value-processor/function-value-processor.d.ts +15 -0
- package/types/value-processor/parameterized-value-processor.d.ts +14 -0
- package/types/value-processor/parameters-value-processor.d.ts +28 -0
- package/types/value-processor/spec.d.ts +22 -0
- package/types/value-processor/value-processor.d.ts +92 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
|
|
2
|
+
import { ValueProcessor } from "../../value-processor/value-processor.js";
|
|
3
|
+
import { ComposedValueProcessor } from '../../value-processor/composed-value-processor.js';
|
|
4
|
+
import { ConditionalExecutor } from '../../executor/conditional-executor.js';
|
|
5
|
+
import { Executor } from '../../executor/executor.js';
|
|
6
|
+
import { ConstraintError, SchemaError } from '../../errors.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* ## $require
|
|
10
|
+
*
|
|
11
|
+
* Require that the provided processor returns a defined value; return the original input if so.
|
|
12
|
+
* Throws a constraint error if the processor does not return a defined value.
|
|
13
|
+
*
|
|
14
|
+
* May be used inline in a pipeline without parameters, or can have a single processor argument.
|
|
15
|
+
*
|
|
16
|
+
* ### Parameters
|
|
17
|
+
* - `processor` (ProcessorSpec, optional): Processor specification to check for a defined return value.
|
|
18
|
+
* If omitted, the input value itself is checked for defined-ness.
|
|
19
|
+
*
|
|
20
|
+
* ### Example
|
|
21
|
+
* ```js
|
|
22
|
+
* // Require the input to be defined (not undefined)
|
|
23
|
+
* new Schema('any').validator('$require')
|
|
24
|
+
*
|
|
25
|
+
* // Require a lookup to succeed (key must exist in the table)
|
|
26
|
+
* new Schema('string').validator({
|
|
27
|
+
* $require: {$lookup: {$literal: {admin: 1, user: 2, guest: 3}}}
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* // Require a nested path to resolve
|
|
31
|
+
* new Schema('object').validator({$require: {$get: 'metadata.version'}})
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @type {import('../../value-processor/value-processor.js').ValueProcessorDefinition}
|
|
35
|
+
*/
|
|
36
|
+
export const REQUIRE_CONSTRAINT = {
|
|
37
|
+
keyword: 'require',
|
|
38
|
+
build: (args) => {
|
|
39
|
+
|
|
40
|
+
/** @type {ValueProcessor|undefined} */
|
|
41
|
+
let processor;
|
|
42
|
+
if (Array.isArray(args)) {
|
|
43
|
+
if (args.length === 1) {
|
|
44
|
+
processor = args[0];
|
|
45
|
+
}
|
|
46
|
+
else if (args.length === 0) {
|
|
47
|
+
processor = new ComposedValueProcessor(new Executor(), []);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
throw new SchemaError('$require requires no more than a single processor argument');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else if (typeof args === 'object') {
|
|
54
|
+
processor = args.processor;
|
|
55
|
+
}
|
|
56
|
+
if (!(processor instanceof ValueProcessor)) {
|
|
57
|
+
throw new SchemaError('$require requires a processor argument');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const spec = args.length === 0? '$require' : {'$require': processor.spec};
|
|
61
|
+
const description = processor.description;
|
|
62
|
+
|
|
63
|
+
return new ComposedValueProcessor(
|
|
64
|
+
new ConditionalExecutor(processor,
|
|
65
|
+
{ failure: (error) => {
|
|
66
|
+
if (error instanceof ConstraintError) {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
throw new ConstraintError('Processed value was undefined', {cause: error}); } },
|
|
70
|
+
[ConditionalExecutor.CHECK_DEFINED, ConditionalExecutor.PASS_ERROR]
|
|
71
|
+
),
|
|
72
|
+
spec, description);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ConstraintError } from '../../errors.js';
|
|
2
|
+
import { formatValue } from '../../helpers/format.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* ## $reverse
|
|
6
|
+
*
|
|
7
|
+
* Returns a new array with elements in reverse order. Non-mutating.
|
|
8
|
+
* Throws if the input is not an array.
|
|
9
|
+
*
|
|
10
|
+
* @type {import('../../value-processor/value-processor.js').ValueProcessorDefinition}
|
|
11
|
+
*/
|
|
12
|
+
export const REVERSE_OPERATOR = {
|
|
13
|
+
keyword: 'reverse',
|
|
14
|
+
process: (value, _target, location) => {
|
|
15
|
+
if (!Array.isArray(value)) {
|
|
16
|
+
throw new ConstraintError(`$reverse requires an array, got ${formatValue(value)}`, {location});
|
|
17
|
+
}
|
|
18
|
+
return [...value].reverse();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ## $round
|
|
3
|
+
*
|
|
4
|
+
* Rounds a numeric value to the nearest integer or to a specified number of decimal places.
|
|
5
|
+
* Safe to use in normalize phase (non-throwing). Non-numeric values pass through unchanged.
|
|
6
|
+
*
|
|
7
|
+
* ### Parameters
|
|
8
|
+
* - `precision` (number, optional): Number of decimal places. Defaults to 0 (integer rounding).
|
|
9
|
+
*
|
|
10
|
+
* **Examples**:
|
|
11
|
+
* - `3.7` with precision 0 → `4`
|
|
12
|
+
* - `3.14159` with precision 2 → `3.14`
|
|
13
|
+
* - `123.456` with precision 1 → `123.5`
|
|
14
|
+
* - `"not a number"` → `"not a number"` (passes through unchanged)
|
|
15
|
+
*
|
|
16
|
+
* ### Example
|
|
17
|
+
* ```js
|
|
18
|
+
* // Round to nearest integer
|
|
19
|
+
* new Schema('number').transformer('$round')
|
|
20
|
+
* // 3.5 → 4, 3.4 → 3
|
|
21
|
+
*
|
|
22
|
+
* // Round a price to 2 decimal places
|
|
23
|
+
* new Schema('number').transformer({$round: {precision: 2}})
|
|
24
|
+
* // 9.9950 → 9.99, 9.9951 → 10.00
|
|
25
|
+
*
|
|
26
|
+
* // Round a sensor reading to 1 decimal place
|
|
27
|
+
* new Schema('object', {
|
|
28
|
+
* temperature: new Schema('number').transformer({$round: {precision: 1}}),
|
|
29
|
+
* })
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
|
|
33
|
+
*/
|
|
34
|
+
export const ROUND_OPERATOR = {
|
|
35
|
+
keyword: 'round',
|
|
36
|
+
parameters: [ { parameter: 'precision', default: 0 } ],
|
|
37
|
+
|
|
38
|
+
process: (value, _target, _location, options) => {
|
|
39
|
+
const precision = options.args.precision;
|
|
40
|
+
const multiplier = Math.pow(10, precision);
|
|
41
|
+
const num = Number(value);
|
|
42
|
+
if (!Number.isFinite(num)) {
|
|
43
|
+
return value; // Pass through non-numeric values unchanged
|
|
44
|
+
}
|
|
45
|
+
return Math.round(num * multiplier) / multiplier;
|
|
46
|
+
},
|
|
47
|
+
/*
|
|
48
|
+
description: precision > 0 ? `round(${precision})` : 'round'
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
*/
|
|
53
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { CompiledSchema } from '../../compiled-schema.js';
|
|
2
|
+
import { SchemaError } from '../../errors.js';
|
|
3
|
+
import { formatValue } from '../../helpers/format.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* ## $normalize
|
|
7
|
+
*
|
|
8
|
+
* Normalize the incoming value according using the provided schema
|
|
9
|
+
*
|
|
10
|
+
* ### Parameters
|
|
11
|
+
* - `schema` (CompiledSchema, required): the compiled schema to apply to the input value.
|
|
12
|
+
* Any `Schema` found in a handler pipeline will be automatically compiled;
|
|
13
|
+
* Use `$compile` to produce a `CompiledSchema` from a `Schema` literal value.
|
|
14
|
+
*
|
|
15
|
+
* ### Example
|
|
16
|
+
* ```js
|
|
17
|
+
* import { Schema, SchemaResolver } from '@versionzero/schema';
|
|
18
|
+
*
|
|
19
|
+
* const resolver = new SchemaResolver();
|
|
20
|
+
*
|
|
21
|
+
* const = await resolver.compile(
|
|
22
|
+
* new Schema('object')
|
|
23
|
+
* .property('collection', new Schema('array')
|
|
24
|
+
* .property('*', new Schema('string').normalizer('$trim').normalizer('$lowercase'))
|
|
25
|
+
* .property('chosen', new Schema('string').normalizer({$normalize: {'$find-schema': '^.collection.*'}})
|
|
26
|
+
* );
|
|
27
|
+
*
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @type {import('../../value-processor/value-processor.js').ValueProcessorDefinition}
|
|
31
|
+
*/
|
|
32
|
+
export const NORMALIZE_OPERATOR = {
|
|
33
|
+
keyword: 'normalize',
|
|
34
|
+
parameters: [ { parameter: 'schema', required: true }, { parameter: 'value', required: false } ],
|
|
35
|
+
|
|
36
|
+
process: (value, target, location, options = {}) => {
|
|
37
|
+
const schema = options.args.schema;
|
|
38
|
+
|
|
39
|
+
if (!(schema instanceof CompiledSchema)) {
|
|
40
|
+
throw new SchemaError(`Schema argument must be an instance of CompiledSchema, got ${formatValue(schema)})`, {location});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const cycleCheck = (options.cycleCheck ?? new Set());
|
|
44
|
+
|
|
45
|
+
if (cycleCheck.has(location.schema)) {
|
|
46
|
+
throw new SchemaError(`Cycle detected while processing $normalize`, {location, value});
|
|
47
|
+
}
|
|
48
|
+
cycleCheck.add(location.schema);
|
|
49
|
+
|
|
50
|
+
const v = options.args.value ?? value;
|
|
51
|
+
|
|
52
|
+
return schema._normalizeValue(v, target, undefined, {cycleCheck}); // do not pass options, or outer schema context/paths will leak in!
|
|
53
|
+
}
|
|
54
|
+
};
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { ConstraintError, ResolverError } from '../../errors.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Strict semver regex per semver.org 2.0.0 spec.
|
|
5
|
+
* Groups: 1=major, 2=minor, 3=patch, 4=prerelease (optional), 5=build (optional)
|
|
6
|
+
*/
|
|
7
|
+
const SEMVER_REGEX = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {{ major: number, minor: number, patch: number, prerelease: string[], build: string[] }} SemVer
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Parse a semver string into its components.
|
|
15
|
+
* @param {string} str
|
|
16
|
+
* @returns {SemVer}
|
|
17
|
+
*/
|
|
18
|
+
function parseSemVer(str) {
|
|
19
|
+
const m = SEMVER_REGEX.exec(str.trim());
|
|
20
|
+
if (!m) {
|
|
21
|
+
throw new ResolverError(`Invalid semver: "${str}"`);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
major: Number(m[1]),
|
|
25
|
+
minor: Number(m[2]),
|
|
26
|
+
patch: Number(m[3]),
|
|
27
|
+
prerelease: m[4] ? m[4].split('.') : [],
|
|
28
|
+
build: m[5] ? m[5].split('.') : [],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Compare two pre-release identifier arrays per semver 2.0.0 §11.
|
|
34
|
+
* Returns negative if a < b, 0 if equal, positive if a > b.
|
|
35
|
+
* @param {string[]} a
|
|
36
|
+
* @param {string[]} b
|
|
37
|
+
* @returns {number}
|
|
38
|
+
*/
|
|
39
|
+
function comparePrerelease(a, b) {
|
|
40
|
+
// no prerelease on either — equal
|
|
41
|
+
if (a.length === 0 && b.length === 0) return 0;
|
|
42
|
+
// a version with prerelease has lower precedence than the release version
|
|
43
|
+
if (a.length === 0) return 1;
|
|
44
|
+
if (b.length === 0) return -1;
|
|
45
|
+
|
|
46
|
+
const len = Math.max(a.length, b.length);
|
|
47
|
+
for (let i = 0; i < len; i++) {
|
|
48
|
+
// fewer fields = lower precedence
|
|
49
|
+
if (i >= a.length) return -1;
|
|
50
|
+
if (i >= b.length) return 1;
|
|
51
|
+
|
|
52
|
+
const ai = a[i];
|
|
53
|
+
const bi = b[i];
|
|
54
|
+
if (ai === bi) continue;
|
|
55
|
+
|
|
56
|
+
const aNum = /^\d+$/.test(ai);
|
|
57
|
+
const bNum = /^\d+$/.test(bi);
|
|
58
|
+
|
|
59
|
+
// numeric identifiers always have lower precedence than alphanumeric
|
|
60
|
+
if (aNum && !bNum) return -1;
|
|
61
|
+
if (!aNum && bNum) return 1;
|
|
62
|
+
|
|
63
|
+
if (aNum && bNum) {
|
|
64
|
+
const diff = Number(ai) - Number(bi);
|
|
65
|
+
if (diff !== 0) return diff;
|
|
66
|
+
} else {
|
|
67
|
+
// both alphanumeric — lexicographic
|
|
68
|
+
if (ai < bi) return -1;
|
|
69
|
+
if (ai > bi) return 1;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Compare two parsed semver objects. Build metadata is ignored per spec.
|
|
77
|
+
* Returns negative if a < b, 0 if equal, positive if a > b.
|
|
78
|
+
* @param {SemVer} a
|
|
79
|
+
* @param {SemVer} b
|
|
80
|
+
* @returns {number}
|
|
81
|
+
*/
|
|
82
|
+
function compareSemVer(a, b) {
|
|
83
|
+
return (a.major - b.major)
|
|
84
|
+
|| (a.minor - b.minor)
|
|
85
|
+
|| (a.patch - b.patch)
|
|
86
|
+
|| comparePrerelease(a.prerelease, b.prerelease);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// --- range parsing ---
|
|
90
|
+
|
|
91
|
+
/** @typedef {(v: SemVer) => boolean} SemVerPredicate */
|
|
92
|
+
|
|
93
|
+
/** Matches a single comparator: optional operator + semver */
|
|
94
|
+
const COMPARATOR_REGEX = /^(>=|<=|>|<|=)?\s*((?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?:[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)$/;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Parse a single comparator (e.g. '>=1.0.0', '<2.0.0', '1.2.3') into a predicate.
|
|
98
|
+
* @param {string} comp
|
|
99
|
+
* @returns {SemVerPredicate}
|
|
100
|
+
*/
|
|
101
|
+
function parseComparator(comp) {
|
|
102
|
+
const m = COMPARATOR_REGEX.exec(comp.trim());
|
|
103
|
+
if (!m) {
|
|
104
|
+
throw new ResolverError(`Invalid semver comparator: "${comp}"`);
|
|
105
|
+
}
|
|
106
|
+
const op = m[1] || '=';
|
|
107
|
+
const target = parseSemVer(m[2]);
|
|
108
|
+
|
|
109
|
+
switch (op) {
|
|
110
|
+
case '=': return (v) => compareSemVer(v, target) === 0;
|
|
111
|
+
case '>': return (v) => compareSemVer(v, target) > 0;
|
|
112
|
+
case '>=': return (v) => compareSemVer(v, target) >= 0;
|
|
113
|
+
case '<': return (v) => compareSemVer(v, target) < 0;
|
|
114
|
+
case '<=': return (v) => compareSemVer(v, target) <= 0;
|
|
115
|
+
default: throw new ResolverError(`Unknown semver operator: "${op}"`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Parse a caret range (^1.2.3) into a predicate.
|
|
121
|
+
* ^major.minor.patch means >=major.minor.patch and:
|
|
122
|
+
* major > 0: < (major+1).0.0
|
|
123
|
+
* major === 0, minor > 0: < 0.(minor+1).0
|
|
124
|
+
* major === 0, minor === 0: < 0.0.(patch+1)
|
|
125
|
+
* @param {string} version
|
|
126
|
+
* @returns {SemVerPredicate}
|
|
127
|
+
*/
|
|
128
|
+
function parseCaret(version) {
|
|
129
|
+
const min = parseSemVer(version);
|
|
130
|
+
/** @type {SemVer} */
|
|
131
|
+
let max;
|
|
132
|
+
if (min.major > 0) {
|
|
133
|
+
max = { major: min.major + 1, minor: 0, patch: 0, prerelease: [], build: [] };
|
|
134
|
+
} else if (min.minor > 0) {
|
|
135
|
+
max = { major: 0, minor: min.minor + 1, patch: 0, prerelease: [], build: [] };
|
|
136
|
+
} else {
|
|
137
|
+
max = { major: 0, minor: 0, patch: min.patch + 1, prerelease: [], build: [] };
|
|
138
|
+
}
|
|
139
|
+
return (v) => compareSemVer(v, min) >= 0 && compareSemVer(v, max) < 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Parse a tilde range (~1.2.3) into a predicate.
|
|
144
|
+
* ~major.minor.patch means >=major.minor.patch <major.(minor+1).0
|
|
145
|
+
* @param {string} version
|
|
146
|
+
* @returns {SemVerPredicate}
|
|
147
|
+
*/
|
|
148
|
+
function parseTilde(version) {
|
|
149
|
+
const min = parseSemVer(version);
|
|
150
|
+
/** @type {SemVer} */
|
|
151
|
+
const max = { major: min.major, minor: min.minor + 1, patch: 0, prerelease: [], build: [] };
|
|
152
|
+
return (v) => compareSemVer(v, min) >= 0 && compareSemVer(v, max) < 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Parse a semver range expression into a predicate.
|
|
157
|
+
* Supports: comparators (>=, >, <=, <, =), caret (^), tilde (~),
|
|
158
|
+
* and space-separated AND of comparators.
|
|
159
|
+
* @param {string} range
|
|
160
|
+
* @returns {SemVerPredicate}
|
|
161
|
+
*/
|
|
162
|
+
function parseRange(range) {
|
|
163
|
+
const trimmed = range.trim();
|
|
164
|
+
|
|
165
|
+
if (trimmed.startsWith('^')) {
|
|
166
|
+
return parseCaret(trimmed.slice(1));
|
|
167
|
+
}
|
|
168
|
+
if (trimmed.startsWith('~')) {
|
|
169
|
+
return parseTilde(trimmed.slice(1));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// space-separated AND of comparators
|
|
173
|
+
const parts = trimmed.split(/\s+/);
|
|
174
|
+
if (parts.length === 1) {
|
|
175
|
+
return parseComparator(parts[0]);
|
|
176
|
+
}
|
|
177
|
+
const predicates = parts.map(parseComparator);
|
|
178
|
+
return (v) => predicates.every(p => p(v));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* ## $semver
|
|
183
|
+
*
|
|
184
|
+
* Validates that a string is a valid semantic version per the semver 2.0.0 spec.
|
|
185
|
+
*
|
|
186
|
+
* ### Parameters
|
|
187
|
+
* - `in` (string, optional): Semver range expression. Supports comparators
|
|
188
|
+
* (`>=1.0.0`, `<2.0.0`), caret (`^1.2.3`), tilde (`~1.2.3`), and
|
|
189
|
+
* space-separated AND (`>=1.0.0 <2.0.0`).
|
|
190
|
+
* - `min` (string, optional): Minimum version (inclusive).
|
|
191
|
+
* - `max` (string, optional): Maximum version (inclusive).
|
|
192
|
+
*
|
|
193
|
+
* Use either `in` OR `min`/`max`, not both.
|
|
194
|
+
*
|
|
195
|
+
* ### Example
|
|
196
|
+
* ```js
|
|
197
|
+
* // Format-only validation
|
|
198
|
+
* new Schema('string').validator('$semver')
|
|
199
|
+
*
|
|
200
|
+
* // Caret range (positional `in`)
|
|
201
|
+
* new Schema('string').validator({$semver: '^1.2.0'})
|
|
202
|
+
*
|
|
203
|
+
* // Tilde range
|
|
204
|
+
* new Schema('string').validator({$semver: '~1.2.0'})
|
|
205
|
+
*
|
|
206
|
+
* // Comparator range
|
|
207
|
+
* new Schema('string').validator({$semver: '>=1.0.0 <2.0.0'})
|
|
208
|
+
*
|
|
209
|
+
* // Explicit min/max (inclusive)
|
|
210
|
+
* new Schema('string').validator({$semver: {min: '1.0.0', max: '2.0.0'}})
|
|
211
|
+
* ```
|
|
212
|
+
*
|
|
213
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
|
|
214
|
+
*/
|
|
215
|
+
export const SEMVER_CONSTRAINT = {
|
|
216
|
+
keyword: 'semver',
|
|
217
|
+
|
|
218
|
+
parameters: [
|
|
219
|
+
{ parameter: 'in', default: undefined, type: 'string' },
|
|
220
|
+
{ parameter: 'min', default: undefined, type: 'string' },
|
|
221
|
+
{ parameter: 'max', default: undefined, type: 'string' },
|
|
222
|
+
],
|
|
223
|
+
|
|
224
|
+
process: (value, _target, _location, options) => {
|
|
225
|
+
const parsed = SEMVER_REGEX.exec(value);
|
|
226
|
+
if (!parsed) {
|
|
227
|
+
throw new ConstraintError('Invalid semver');
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const { in: inRange, min, max } = options?.args ?? {};
|
|
231
|
+
|
|
232
|
+
if (inRange !== undefined && (min !== undefined || max !== undefined)) {
|
|
233
|
+
throw new ResolverError('$semver: "in" and "min"/"max" are mutually exclusive');
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const ver = {
|
|
237
|
+
major: Number(parsed[1]),
|
|
238
|
+
minor: Number(parsed[2]),
|
|
239
|
+
patch: Number(parsed[3]),
|
|
240
|
+
prerelease: parsed[4] ? parsed[4].split('.') : [],
|
|
241
|
+
build: parsed[5] ? parsed[5].split('.') : [],
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
if (inRange !== undefined) {
|
|
245
|
+
const predicate = parseRange(inRange);
|
|
246
|
+
if (!predicate(ver)) {
|
|
247
|
+
throw new ConstraintError(`Version not in range "${inRange}"`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (min !== undefined) {
|
|
252
|
+
if (compareSemVer(ver, parseSemVer(min)) < 0) {
|
|
253
|
+
throw new ConstraintError(`Version below minimum ${min}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (max !== undefined) {
|
|
257
|
+
if (compareSemVer(ver, parseSemVer(max)) > 0) {
|
|
258
|
+
throw new ConstraintError(`Version above maximum ${max}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return value;
|
|
263
|
+
},
|
|
264
|
+
|
|
265
|
+
describe: (args) => {
|
|
266
|
+
if (!args) return undefined;
|
|
267
|
+
|
|
268
|
+
const inProcessor = (Array.isArray(args) ? args[0] : args.in);
|
|
269
|
+
const minProcessor = (Array.isArray(args) ? args[1] : args.min);
|
|
270
|
+
const maxProcessor = (Array.isArray(args) ? args[2] : args.max);
|
|
271
|
+
|
|
272
|
+
const inVal = inProcessor?.description;
|
|
273
|
+
const min = minProcessor?.description;
|
|
274
|
+
const max = maxProcessor?.description;
|
|
275
|
+
|
|
276
|
+
if (inVal !== undefined) return `in ${inVal}`;
|
|
277
|
+
if (min !== undefined && max !== undefined) return `${min}–${max}`;
|
|
278
|
+
if (min !== undefined) return `≥${min}`;
|
|
279
|
+
if (max !== undefined) return `≤${max}`;
|
|
280
|
+
return undefined;
|
|
281
|
+
}
|
|
282
|
+
};
|