@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,37 @@
|
|
|
1
|
+
import { ConstraintError } from '../../errors.js';
|
|
2
|
+
import { formatValue } from '../../helpers/format.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* ## $has-prefix
|
|
6
|
+
*
|
|
7
|
+
* Check that the provided string value starts with the prefix value
|
|
8
|
+
*
|
|
9
|
+
* ### Parameters
|
|
10
|
+
* - `match` (string, required): The required prefix string.
|
|
11
|
+
*
|
|
12
|
+
* ### Example
|
|
13
|
+
* ```js
|
|
14
|
+
* // Require all feature flag names to start with 'ff_'
|
|
15
|
+
* new Schema('string').validator({'$has-prefix': 'ff_'})
|
|
16
|
+
*
|
|
17
|
+
* // Require environment variables to start with 'APP_'
|
|
18
|
+
* new Schema('object', {
|
|
19
|
+
* envKey: new Schema('string').validator({'$has-prefix': 'APP_'}),
|
|
20
|
+
* })
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}*
|
|
24
|
+
*/
|
|
25
|
+
export const HAS_PREFIX_CONSTRAINT = {
|
|
26
|
+
keyword: 'has-prefix',
|
|
27
|
+
parameters: [ { parameter: 'match', required: true } ],
|
|
28
|
+
|
|
29
|
+
process: (value, _target, location, options) => {
|
|
30
|
+
const prefix = options.args['match'];
|
|
31
|
+
|
|
32
|
+
if (!`${value}`.startsWith(prefix)) {
|
|
33
|
+
throw new ConstraintError(`Value ${formatValue(value)} did not start with prefix ${formatValue(prefix)}`, {location});
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ConstraintError } from '../../errors.js';
|
|
2
|
+
import { formatValue } from '../../helpers/format.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* ## $has-suffix
|
|
6
|
+
*
|
|
7
|
+
* Check that the provided string value ends with the suffix value
|
|
8
|
+
*
|
|
9
|
+
* ### Parameters
|
|
10
|
+
* - `match` (string, required): The required suffix string.
|
|
11
|
+
*
|
|
12
|
+
* ### Example
|
|
13
|
+
* ```js
|
|
14
|
+
* // Require file paths to end with '.json'
|
|
15
|
+
* new Schema('string').validator({'$has-suffix': '.json'})
|
|
16
|
+
*
|
|
17
|
+
* // Require callback URLs to end with '/callback'
|
|
18
|
+
* new Schema('string').validator({'$has-suffix': '/callback'})
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}*
|
|
22
|
+
*/
|
|
23
|
+
export const HAS_SUFFIX_CONSTRAINT = {
|
|
24
|
+
keyword: 'has-suffix',
|
|
25
|
+
parameters: [ { parameter: 'match', required: true } ],
|
|
26
|
+
|
|
27
|
+
process: (value, _target, location, options) => {
|
|
28
|
+
const suffix = options.args['match'];
|
|
29
|
+
|
|
30
|
+
if (!`${value}`.endsWith(suffix)) {
|
|
31
|
+
throw new ConstraintError(`Value ${formatValue(value)} did not end with suffix ${formatValue(suffix)}`, {location});
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ConstraintError } from '../../errors.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ## $hex
|
|
5
|
+
*
|
|
6
|
+
* Validates that a string contains only valid hexadecimal characters (0-9, a-f, A-F).
|
|
7
|
+
* Does not require or validate a "0x" prefix - the value should be the raw hex digits.
|
|
8
|
+
*
|
|
9
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
|
|
10
|
+
*/
|
|
11
|
+
export const HEX_CONSTRAINT = {
|
|
12
|
+
keyword: 'hex',
|
|
13
|
+
process: (value) => {
|
|
14
|
+
const hexRegex = /^[0-9a-fA-F]+$/;
|
|
15
|
+
if (!hexRegex.test(value)) {
|
|
16
|
+
throw new ConstraintError('Must contain only hexadecimal characters');
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ConstraintError } from '../../errors.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ## $hostname
|
|
5
|
+
*
|
|
6
|
+
* Validates that a string matches valid hostname format according to RFC 1123.
|
|
7
|
+
* Hostnames must start and end with alphanumeric characters and may contain
|
|
8
|
+
* hyphens between labels. Each label (section between dots) can be up to 63
|
|
9
|
+
* characters long.
|
|
10
|
+
*
|
|
11
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
|
|
12
|
+
*/
|
|
13
|
+
export const HOSTNAME_CONSTRAINT = {
|
|
14
|
+
keyword: 'hostname',
|
|
15
|
+
process: (value) => {
|
|
16
|
+
const hostnameRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
|
17
|
+
if (!hostnameRegex.test(value)) {
|
|
18
|
+
throw new ConstraintError('Invalid hostname format');
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ConstraintError } from '../../errors.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ## $http-url
|
|
5
|
+
*
|
|
6
|
+
* Validates that a string is a valid HTTP or HTTPS URL. Uses the URL Web API for
|
|
7
|
+
* validation and specifically requires the protocol to be either `http:` or `https:`.
|
|
8
|
+
*
|
|
9
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
|
|
10
|
+
*/
|
|
11
|
+
export const HTTP_URL_CONSTRAINT = {
|
|
12
|
+
keyword: 'http-url',
|
|
13
|
+
process: (value) => {
|
|
14
|
+
try {
|
|
15
|
+
const url = new URL(value);
|
|
16
|
+
if (!['http:', 'https:'].includes(url.protocol)) {
|
|
17
|
+
throw new ConstraintError('URL must use HTTP or HTTPS protocol');
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
} catch (error) {
|
|
21
|
+
if (error instanceof ConstraintError) {
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
throw new ConstraintError('Invalid HTTP URL format', {cause: error});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { isEmpty, map } from "../../helpers/object.js";
|
|
2
|
+
import { ComposedValueProcessor } from "../../value-processor/composed-value-processor.js";
|
|
3
|
+
import { FunctionValueProcessor } from '../../value-processor/function-value-processor.js';
|
|
4
|
+
import { ArrayExecutor } from '../../executor/array-executor.js';
|
|
5
|
+
import { ConstraintError, ResolverError, SchemaError } from '../../errors.js';
|
|
6
|
+
|
|
7
|
+
/** @import {ValueProcessor, ValueProcessorDefinition} from '../../value-processor/value-processor.js' */
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* ## $in
|
|
11
|
+
*
|
|
12
|
+
* Validates that a value is included in an allowed list of values.
|
|
13
|
+
* Uses strict equality (===) for comparison.
|
|
14
|
+
*
|
|
15
|
+
* ### Parameters
|
|
16
|
+
* The parameter is an array (not an object) of allowed values passed directly to the processor.
|
|
17
|
+
* - Array of values (array, required): The allowed values to match against using strict equality
|
|
18
|
+
*
|
|
19
|
+
* ### Example
|
|
20
|
+
* ```js
|
|
21
|
+
* // Restrict a log level to known values
|
|
22
|
+
* new Schema('string').validator({$in: ['debug', 'info', 'warn', 'error']})
|
|
23
|
+
*
|
|
24
|
+
* // Accept only specific HTTP methods
|
|
25
|
+
* new Schema('string').normalizer('$uppercase').validator({$in: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH']})
|
|
26
|
+
*
|
|
27
|
+
* // Restrict a numeric status code to expected values
|
|
28
|
+
* new Schema('number').validator({$in: [200, 201, 204, 400, 401, 403, 404, 500]})
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @type {ValueProcessorDefinition}
|
|
32
|
+
*/
|
|
33
|
+
export const IN_CONSTRAINT = {
|
|
34
|
+
keyword: 'in',
|
|
35
|
+
|
|
36
|
+
build: (args) => {
|
|
37
|
+
|
|
38
|
+
const vpa = (Array.isArray(args)? args : args?.['values']);
|
|
39
|
+
|
|
40
|
+
if (isEmpty(args)) {
|
|
41
|
+
throw new SchemaError('Must define at least one value for $in');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const description = Array.isArray(vpa)? vpa.map(v => v.description).join('|')
|
|
45
|
+
: '[?]';
|
|
46
|
+
|
|
47
|
+
const argsSpec = map(vpa, v => v.spec)
|
|
48
|
+
const spec = {$in: argsSpec}
|
|
49
|
+
|
|
50
|
+
/** @type {ValueProcessor} */
|
|
51
|
+
const processor =
|
|
52
|
+
new FunctionValueProcessor(
|
|
53
|
+
(value, _target, location, options) => {
|
|
54
|
+
const values = (Array.isArray(options.args)? options.args : args.values) ?? [];
|
|
55
|
+
if (!values.includes(value)) {
|
|
56
|
+
throw new ConstraintError(`Value must be one of {${values.join('|')}}`, {location});
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}, new ComposedValueProcessor(new ArrayExecutor(vpa), argsSpec)
|
|
60
|
+
);
|
|
61
|
+
// yuck, need a better contract for this...
|
|
62
|
+
processor.spec = spec;
|
|
63
|
+
processor.description = description;
|
|
64
|
+
return processor;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
|
|
2
|
+
import { FunctionValueProcessor } from '../../value-processor/function-value-processor.js';
|
|
3
|
+
import { ComposedValueProcessor } from '../../value-processor/composed-value-processor.js';
|
|
4
|
+
import { EachExecutor } from '../../executor/each-executor.js';
|
|
5
|
+
import { ConstraintError, SchemaError } from '../../errors.js';
|
|
6
|
+
import { Executor } from '../../executor/executor.js';
|
|
7
|
+
import { ParametersValueProcessor } from "../../value-processor/parameters-value-processor.js";
|
|
8
|
+
import { ConditionalExecutor } from '../../executor/conditional-executor.js';
|
|
9
|
+
import { formatValue } from '../../helpers/format.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* ## $index-by
|
|
13
|
+
*
|
|
14
|
+
* Groups an array of objects by a unique key, returning an object whose value is the single array element value
|
|
15
|
+
* that has that key. If the keys are not unique, throws an error.
|
|
16
|
+
*
|
|
17
|
+
* - `{'$index-by': 'key'}` — indexes by the named property on each element
|
|
18
|
+
* - `{'$index-by': processor}` — indexes by the result of executing the processor against each element
|
|
19
|
+
*
|
|
20
|
+
* Elements where the extracted key is `undefined` are omitted from the result.
|
|
21
|
+
*
|
|
22
|
+
* ### Parameters
|
|
23
|
+
* - `key` (string): Property name to group by, or a processor that extracts
|
|
24
|
+
* the grouping key from each element. If you use a bare argument or a single element array,
|
|
25
|
+
* it is assumed to be the key.
|
|
26
|
+
* - `processor`: Must be passed via object parameter. Must be a processor that will parse the provided
|
|
27
|
+
* element and return the index key. The outer collection is passed to the processor as `options.input`.
|
|
28
|
+
*
|
|
29
|
+
* ### Example
|
|
30
|
+
* ```js
|
|
31
|
+
* // TODO
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @type {import('../../value-processor/value-processor.js').ValueProcessorDefinition}
|
|
35
|
+
*/
|
|
36
|
+
export const INDEX_BY_OPERATOR = {
|
|
37
|
+
keyword: 'index-by',
|
|
38
|
+
parameters: [{parameter: 'processor', required: true}],
|
|
39
|
+
build: (args) => {
|
|
40
|
+
|
|
41
|
+
let processor;
|
|
42
|
+
let keyProcessor;
|
|
43
|
+
|
|
44
|
+
if (Array.isArray(args)) {
|
|
45
|
+
if (args.length !== 1) {
|
|
46
|
+
throw new SchemaError(`$index-by requires only a single key, or extended arguments with a processor`);
|
|
47
|
+
}
|
|
48
|
+
keyProcessor = args[0];
|
|
49
|
+
}
|
|
50
|
+
else if (typeof args === 'object') {
|
|
51
|
+
keyProcessor = args.key;
|
|
52
|
+
processor = args.processor;
|
|
53
|
+
}
|
|
54
|
+
if (keyProcessor) {
|
|
55
|
+
if (processor) {
|
|
56
|
+
throw new SchemaError(`$index-by requires only a key or a processor, not both`);
|
|
57
|
+
}
|
|
58
|
+
processor = new FunctionValueProcessor((value, target, location, options) => {
|
|
59
|
+
const result = keyProcessor.execute(value, target, location, {...options, input: value});
|
|
60
|
+
|
|
61
|
+
if (result instanceof Promise) {
|
|
62
|
+
return result.then(resolved => (resolved !== undefined)? value?.[resolved] : undefined)
|
|
63
|
+
}
|
|
64
|
+
return result !== undefined ? value?.[result] : undefined;
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (!processor) {
|
|
69
|
+
throw new SchemaError(`$index-by requires a key or processor argument`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return new ComposedValueProcessor(
|
|
73
|
+
new EachExecutor(
|
|
74
|
+
processor,
|
|
75
|
+
(input) => {
|
|
76
|
+
if (!Array.isArray(input)) {
|
|
77
|
+
throw new ConstraintError(`$index-by requires an array, got ${formatValue(input)}`);
|
|
78
|
+
}
|
|
79
|
+
return input;
|
|
80
|
+
},
|
|
81
|
+
(keys, input) => {
|
|
82
|
+
const result = {};
|
|
83
|
+
for (let i = 0; i < input.length; i++) {
|
|
84
|
+
const key = keys[i];
|
|
85
|
+
if (key === undefined) continue;
|
|
86
|
+
if (result[String(key)] !== undefined) {
|
|
87
|
+
// todo - add a conflict policy argument, e.g. "first", "last", "error"
|
|
88
|
+
throw new ConstraintError(`$index-by requires unique keys, got duplicate key ${key}`);
|
|
89
|
+
}
|
|
90
|
+
result[String(key)] = input[i];
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
{'$index-by': args}
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/** @import { ValueProcessorDefinition } from '../../value-processor/value-processor.js'; */
|
|
2
|
+
|
|
3
|
+
let modules;
|
|
4
|
+
try {
|
|
5
|
+
modules ??= await Promise.all([
|
|
6
|
+
import('./aggregation-operators.js'),
|
|
7
|
+
import('./alpha-constraint.js'),
|
|
8
|
+
import('./alphanum-constraint.js'),
|
|
9
|
+
import('./array-operator.js'),
|
|
10
|
+
import('./assert-constraint.js'),
|
|
11
|
+
import('./base64-constraint.js'),
|
|
12
|
+
import('./camel-case-operator.js'),
|
|
13
|
+
import('./capitalize-operator.js'),
|
|
14
|
+
import('./cardnum-constraint.js'),
|
|
15
|
+
import('./ceil-operator.js'),
|
|
16
|
+
import('./collapse-operator.js'),
|
|
17
|
+
import('./compact-operator.js'),
|
|
18
|
+
import('./compile-operator.js'),
|
|
19
|
+
import('./concat-operator.js'),
|
|
20
|
+
import('./conditional-operators.js'),
|
|
21
|
+
import('./constant-case-operator.js'),
|
|
22
|
+
import('./data-size-operator.js'),
|
|
23
|
+
import('./date-object-operator.js'),
|
|
24
|
+
import('./date-operator.js'),
|
|
25
|
+
import('./date-range-constraint.js'),
|
|
26
|
+
import('./defined-constraint.js'),
|
|
27
|
+
import('./each-operator.js'),
|
|
28
|
+
import('./email-constraint.js'),
|
|
29
|
+
import('./entries-operator.js'),
|
|
30
|
+
import('./eq-constraint.js'),
|
|
31
|
+
import('./filter-operator.js'),
|
|
32
|
+
import('./find-schema-operator.js'),
|
|
33
|
+
import('./flatten-operator.js'),
|
|
34
|
+
import('./floor-operator.js'),
|
|
35
|
+
import('./get-operator.js'),
|
|
36
|
+
import('./group-by-operator.js'),
|
|
37
|
+
import('./has-prefix-constraint.js'),
|
|
38
|
+
import('./has-suffix-constraint.js'),
|
|
39
|
+
import('./hex-constraint.js'),
|
|
40
|
+
import('./hostname-constraint.js'),
|
|
41
|
+
import('./http-url-constraint.js'),
|
|
42
|
+
import('./in-constraint.js'),
|
|
43
|
+
import('./instanceof-constraint.js'),
|
|
44
|
+
import('./index-by-operator.js'),
|
|
45
|
+
import('./input-operator.js'),
|
|
46
|
+
import('./integer-constraint.js'),
|
|
47
|
+
import('./invoke-operator.js'),
|
|
48
|
+
import('./ipv4-constraint.js'),
|
|
49
|
+
import('./ipv6-constraint.js'),
|
|
50
|
+
import('./is-array-constraint.js'),
|
|
51
|
+
import('./is-date-constraint.js'),
|
|
52
|
+
import('./is-number-constraint.js'),
|
|
53
|
+
import('./is-object-constraint.js'),
|
|
54
|
+
import('./is-string-constraint.js'),
|
|
55
|
+
import('./join-operator.js'),
|
|
56
|
+
import('./json-constraint.js'),
|
|
57
|
+
import('./json-decode-operator.js'),
|
|
58
|
+
import('./json-encode-operator.js'),
|
|
59
|
+
import('./kebab-case-operator.js'),
|
|
60
|
+
import('./keys-operator.js'),
|
|
61
|
+
import('./length-constraint.js'),
|
|
62
|
+
import('./lookup-operator.js'),
|
|
63
|
+
import('./lowercase-operator.js'),
|
|
64
|
+
import('./map-operator.js'),
|
|
65
|
+
import('./match-operator.js'),
|
|
66
|
+
import('./matches-constraint.js'),
|
|
67
|
+
import('./math-operators.js'),
|
|
68
|
+
import('./merge-deep-operator.js'),
|
|
69
|
+
import('./merge-operator.js'),
|
|
70
|
+
import('./metadata-operator.js'),
|
|
71
|
+
import('./negative-constraint.js'),
|
|
72
|
+
import('./never-constraint.js'),
|
|
73
|
+
import('./non-empty-constraint.js'),
|
|
74
|
+
import('./not-constraint.js'),
|
|
75
|
+
import('./number-operator.js'),
|
|
76
|
+
import('./numeric-constraint.js'),
|
|
77
|
+
import('./object-operator.js'),
|
|
78
|
+
import('./omit-operator.js'),
|
|
79
|
+
import('./parallel-operator.js'),
|
|
80
|
+
import('./pascal-case-operator.js'),
|
|
81
|
+
import('./pick-operator.js'),
|
|
82
|
+
import('./phone-constraint.js'),
|
|
83
|
+
import('./pipeline-operator.js'),
|
|
84
|
+
import('./port-constraint.js'),
|
|
85
|
+
import('./positive-constraint.js'),
|
|
86
|
+
import('./process-operator.js'),
|
|
87
|
+
import('./property-operator.js'),
|
|
88
|
+
import('./range-constraint.js'),
|
|
89
|
+
import('./reference-operator.js'),
|
|
90
|
+
import('./require-constraint.js'),
|
|
91
|
+
import('./reverse-operator.js'),
|
|
92
|
+
import('./round-operator.js'),
|
|
93
|
+
import('./schema-handler-operators.js'),
|
|
94
|
+
import('./semver-constraint.js'),
|
|
95
|
+
import('./sequence-processors.js'),
|
|
96
|
+
import('./sort-operator.js'),
|
|
97
|
+
import('./split-operator.js'),
|
|
98
|
+
import('./string-extra-operators.js'),
|
|
99
|
+
import('./string-operator.js'),
|
|
100
|
+
import('./target-operator.js'),
|
|
101
|
+
import('./template-operator.js'),
|
|
102
|
+
import('./title-case-operator.js'),
|
|
103
|
+
import('./type-operator.js'),
|
|
104
|
+
import('./trim-operator.js'),
|
|
105
|
+
import('./truthy-constraint.js'),
|
|
106
|
+
import('./unique-operator.js'),
|
|
107
|
+
import('./uppercase-operator.js'),
|
|
108
|
+
import('./url-constraint.js'),
|
|
109
|
+
import('./url-decode-operator.js'),
|
|
110
|
+
import('./url-encode-operator.js'),
|
|
111
|
+
import('./uuid-constraint.js'),
|
|
112
|
+
import('./values-operator.js'),
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
throw new Error('Failed to load built-in processors', { cause: error });
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
/** @type {ValueProcessorDefinition[]} */
|
|
121
|
+
export const BUILTIN_PROCESSORS = modules.flatMap(
|
|
122
|
+
ns => Object.values(ns).filter(v => v && typeof v.keyword === 'string')
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get all built-in value processor definitions
|
|
127
|
+
* @returns {ValueProcessorDefinition[]}
|
|
128
|
+
*/
|
|
129
|
+
export function getBuiltinProcessors() {
|
|
130
|
+
return BUILTIN_PROCESSORS;
|
|
131
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ## $input
|
|
3
|
+
*
|
|
4
|
+
* Returns the input value passed to the processor. Acts as a declarative "pass-through".
|
|
5
|
+
* Useful for passing the input to processor arguments that don't normally use the input as a default,
|
|
6
|
+
* or as a placeholder in array arguments.
|
|
7
|
+
*
|
|
8
|
+
* ### Example
|
|
9
|
+
* ```js
|
|
10
|
+
* //
|
|
11
|
+
* new Schema('string')
|
|
12
|
+
* .transformer([['{', '$input', '}']])
|
|
13
|
+
* .transformer({'$join': ''})
|
|
14
|
+
*
|
|
15
|
+
* "hello" -> "{hello}"
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
|
|
19
|
+
*/
|
|
20
|
+
export const INPUT_OPERATOR = {
|
|
21
|
+
keyword: 'input',
|
|
22
|
+
process: input => input
|
|
23
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ConstraintError } from '../../errors.js';
|
|
2
|
+
import { formatValue } from '../../helpers/format.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* ## $instanceof
|
|
6
|
+
*
|
|
7
|
+
* Validates that the input is an instance of the specified constructor.
|
|
8
|
+
*
|
|
9
|
+
* ### Parameters
|
|
10
|
+
* - `clazz` (Function, required): The constructor function to test against.
|
|
11
|
+
*
|
|
12
|
+
* ### Example
|
|
13
|
+
* ```js
|
|
14
|
+
* // Validate that a value is an instance of a custom class
|
|
15
|
+
* new Schema('any').validator({$instanceof: MyClass})
|
|
16
|
+
*
|
|
17
|
+
* // Validate that a value is a Map
|
|
18
|
+
* new Schema('any').validator({$instanceof: Map})
|
|
19
|
+
*
|
|
20
|
+
* // Validate that a value is an Error
|
|
21
|
+
* new Schema('any').validator({$instanceof: Error})
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
|
|
25
|
+
*/
|
|
26
|
+
export const INSTANCEOF_CONSTRAINT = {
|
|
27
|
+
keyword: 'instanceof',
|
|
28
|
+
parameters: [ { parameter: 'clazz', type: 'function', required: true } ],
|
|
29
|
+
|
|
30
|
+
process: (value, _target, location, options) => {
|
|
31
|
+
const ctor = options.args['clazz'];
|
|
32
|
+
if (!(value instanceof ctor)) {
|
|
33
|
+
const name = ctor.name || 'anonymous';
|
|
34
|
+
throw new ConstraintError(`Expected instance of ${name}, got ${formatValue(value)}`, {location});
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ConstraintError } from '../../errors.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ## $integer
|
|
5
|
+
*
|
|
6
|
+
* Validates that a numeric value is an integer (no fractional part).
|
|
7
|
+
* Input must already be a number; use `$number` in a prior normalizer if coercion from string is needed.
|
|
8
|
+
*
|
|
9
|
+
* @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
|
|
10
|
+
*/
|
|
11
|
+
export const INTEGER_CONSTRAINT = {
|
|
12
|
+
keyword: 'integer',
|
|
13
|
+
process: (value) => {
|
|
14
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
15
|
+
throw new ConstraintError('Must be a finite number');
|
|
16
|
+
}
|
|
17
|
+
if (!Number.isInteger(value)) {
|
|
18
|
+
throw new ConstraintError('Must be an integer');
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ComposedValueProcessor } from '../../value-processor/composed-value-processor.js';
|
|
2
|
+
import { Executor } from '../../executor/executor.js';
|
|
3
|
+
import { PipelineExecutor } from '../../executor/pipeline-executor.js';
|
|
4
|
+
import { ParameterizedValueProcessor } from '../../value-processor/parameterized-value-processor.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* ## $invoke
|
|
8
|
+
*
|
|
9
|
+
* Calls a provided processor and passes it arguments (if any).
|
|
10
|
+
*
|
|
11
|
+
* ### Parameters
|
|
12
|
+
* - `processor` (any valid processor spec, required): The processor to invoke.
|
|
13
|
+
* - `arguments` (optional; any extra values to pass to the processor in `options.args`)
|
|
14
|
+
*
|
|
15
|
+
* @type {import('../../value-processor/value-processor.js').ValueProcessorDefinition}
|
|
16
|
+
*/
|
|
17
|
+
export const INVOKE_OPERATOR = {
|
|
18
|
+
keyword: 'invoke',
|
|
19
|
+
parameters: [{parameter: 'processor', required: true}, {parameter: 'arguments', required: false}],
|
|
20
|
+
build: (args) => {
|
|
21
|
+
const processor = (Array.isArray(args)? args[0] : args.processor);
|
|
22
|
+
const wrapped = new ComposedValueProcessor(new PipelineExecutor([
|
|
23
|
+
processor,
|
|
24
|
+
v => v
|
|
25
|
+
]), processor.spec)
|
|
26
|
+
const processorArguments = (Array.isArray(args)? args[1] : args['arguments']);
|
|
27
|
+
|
|
28
|
+
return new ParameterizedValueProcessor(wrapped, processorArguments, {$invoke: {processor: processor?.spec, arguments: processorArguments?.spec}})
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|