@clementine-solutions/jane-io 1.0.0 → 1.0.2
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/README.md +132 -1
- package/dist/core/analysis/diff.d.ts +35 -0
- package/dist/core/analysis/diff.js +88 -0
- package/dist/core/analysis/explain.d.ts +35 -0
- package/dist/core/analysis/explain.js +117 -0
- package/dist/core/analysis/index.d.ts +14 -0
- package/dist/core/analysis/index.js +26 -0
- package/dist/core/analysis/replay.d.ts +34 -0
- package/dist/core/analysis/replay.js +68 -0
- package/dist/core/analysis/telemetry.d.ts +28 -0
- package/dist/core/analysis/telemetry.js +123 -0
- package/dist/core/boundary-rules/at-most-one.d.ts +17 -0
- package/dist/core/boundary-rules/at-most-one.js +38 -0
- package/dist/core/boundary-rules/conditionally-required.d.ts +18 -0
- package/dist/core/boundary-rules/conditionally-required.js +44 -0
- package/dist/core/boundary-rules/date-range.d.ts +17 -0
- package/dist/core/boundary-rules/date-range.js +39 -0
- package/dist/core/boundary-rules/index.d.ts +18 -0
- package/dist/core/boundary-rules/index.js +21 -0
- package/dist/core/boundary-rules/mutually-exclusive.d.ts +16 -0
- package/dist/core/boundary-rules/mutually-exclusive.js +38 -0
- package/dist/core/boundary-rules/no-unknown-fields.d.ts +17 -0
- package/dist/core/boundary-rules/no-unknown-fields.js +39 -0
- package/dist/core/boundary-rules/require-all.d.ts +16 -0
- package/dist/core/boundary-rules/require-all.js +39 -0
- package/dist/core/boundary-rules/require-one.d.ts +17 -0
- package/dist/core/boundary-rules/require-one.js +41 -0
- package/dist/core/common/events.d.ts +37 -0
- package/dist/core/common/events.js +82 -0
- package/dist/core/common/fluent.d.ts +151 -0
- package/dist/core/common/fluent.js +429 -0
- package/dist/core/common/index.d.ts +16 -0
- package/dist/core/common/index.js +31 -0
- package/dist/core/common/policy.d.ts +170 -0
- package/dist/core/common/policy.js +550 -0
- package/dist/core/common/utilities.d.ts +59 -0
- package/dist/core/common/utilities.js +177 -0
- package/dist/core/common/wildcard.d.ts +27 -0
- package/dist/core/common/wildcard.js +63 -0
- package/dist/core/field-path/construct.d.ts +77 -0
- package/dist/core/field-path/construct.js +189 -0
- package/dist/core/field-path/format.d.ts +41 -0
- package/dist/core/field-path/format.js +154 -0
- package/dist/core/field-path/index.d.ts +14 -0
- package/dist/core/field-path/index.js +26 -0
- package/dist/core/field-path/utilities.d.ts +85 -0
- package/dist/core/field-path/utilities.js +138 -0
- package/dist/core/field-path/walk.d.ts +36 -0
- package/dist/core/field-path/walk.js +80 -0
- package/dist/core/fluent-registry.d.ts +138 -0
- package/dist/core/fluent-registry.js +151 -0
- package/dist/core/normalizers/array/compact-sparse-array.d.ts +22 -0
- package/dist/core/normalizers/array/compact-sparse-array.js +40 -0
- package/dist/core/normalizers/array/flatten-one-level.d.ts +17 -0
- package/dist/core/normalizers/array/flatten-one-level.js +45 -0
- package/dist/core/normalizers/array/remove-empty-string-items.d.ts +6 -0
- package/dist/core/normalizers/array/remove-empty-string-items.js +34 -0
- package/dist/core/normalizers/array/remove-null-items.d.ts +16 -0
- package/dist/core/normalizers/array/remove-null-items.js +34 -0
- package/dist/core/normalizers/array/remove-undefined-items.d.ts +16 -0
- package/dist/core/normalizers/array/remove-undefined-items.js +34 -0
- package/dist/core/normalizers/date/invalid-date-to-undefined.d.ts +17 -0
- package/dist/core/normalizers/date/invalid-date-to-undefined.js +35 -0
- package/dist/core/normalizers/index.d.ts +28 -0
- package/dist/core/normalizers/index.js +46 -0
- package/dist/core/normalizers/normalizer-register.d.ts +17 -0
- package/dist/core/normalizers/normalizer-register.js +41 -0
- package/dist/core/normalizers/number/infinity-to-undefined.d.ts +18 -0
- package/dist/core/normalizers/number/infinity-to-undefined.js +35 -0
- package/dist/core/normalizers/number/nan-to-undefined.d.ts +17 -0
- package/dist/core/normalizers/number/nan-to-undefined.js +34 -0
- package/dist/core/normalizers/number/normalize-negative-zero.d.ts +16 -0
- package/dist/core/normalizers/number/normalize-negative-zero.js +33 -0
- package/dist/core/normalizers/object/remove-empty-array-keys.d.ts +17 -0
- package/dist/core/normalizers/object/remove-empty-array-keys.js +38 -0
- package/dist/core/normalizers/object/remove-empty-object-keys.d.ts +16 -0
- package/dist/core/normalizers/object/remove-empty-object-keys.js +42 -0
- package/dist/core/normalizers/object/remove-empty-string-keys.d.ts +16 -0
- package/dist/core/normalizers/object/remove-empty-string-keys.js +37 -0
- package/dist/core/normalizers/object/remove-null-keys.d.ts +16 -0
- package/dist/core/normalizers/object/remove-null-keys.js +37 -0
- package/dist/core/normalizers/object/remove-undefined-keys.d.ts +16 -0
- package/dist/core/normalizers/object/remove-undefined-keys.js +37 -0
- package/dist/core/normalizers/string/collapse-whitespace.d.ts +17 -0
- package/dist/core/normalizers/string/collapse-whitespace.js +35 -0
- package/dist/core/normalizers/string/empty-to-undefined.d.ts +16 -0
- package/dist/core/normalizers/string/empty-to-undefined.js +33 -0
- package/dist/core/normalizers/string/trim.d.ts +16 -0
- package/dist/core/normalizers/string/trim.js +34 -0
- package/dist/core/parsers/index.d.ts +22 -0
- package/dist/core/parsers/index.js +43 -0
- package/dist/core/parsers/parse-array-string.d.ts +16 -0
- package/dist/core/parsers/parse-array-string.js +36 -0
- package/dist/core/parsers/parse-bigint-string.d.ts +16 -0
- package/dist/core/parsers/parse-bigint-string.js +33 -0
- package/dist/core/parsers/parse-binary-string.d.ts +16 -0
- package/dist/core/parsers/parse-binary-string.js +33 -0
- package/dist/core/parsers/parse-boolean-string.d.ts +16 -0
- package/dist/core/parsers/parse-boolean-string.js +27 -0
- package/dist/core/parsers/parse-date-string.d.ts +16 -0
- package/dist/core/parsers/parse-date-string.js +30 -0
- package/dist/core/parsers/parse-duration-string.d.ts +16 -0
- package/dist/core/parsers/parse-duration-string.js +37 -0
- package/dist/core/parsers/parse-hex-string.d.ts +16 -0
- package/dist/core/parsers/parse-hex-string.js +29 -0
- package/dist/core/parsers/parse-integer-string.d.ts +16 -0
- package/dist/core/parsers/parse-integer-string.js +30 -0
- package/dist/core/parsers/parse-json-string.d.ts +17 -0
- package/dist/core/parsers/parse-json-string.js +35 -0
- package/dist/core/parsers/parse-numeric-string.d.ts +16 -0
- package/dist/core/parsers/parse-numeric-string.js +29 -0
- package/dist/core/parsers/parse-object-string.d.ts +16 -0
- package/dist/core/parsers/parse-object-string.js +36 -0
- package/dist/core/parsers/parse-octal-string.d.ts +16 -0
- package/dist/core/parsers/parse-octal-string.js +33 -0
- package/dist/core/parsers/parse-scientific-notation-string.d.ts +16 -0
- package/dist/core/parsers/parse-scientific-notation-string.js +30 -0
- package/dist/core/parsers/parse-url-string.d.ts +16 -0
- package/dist/core/parsers/parse-url-string.js +36 -0
- package/dist/core/pipeline/boundary.d.ts +36 -0
- package/dist/core/pipeline/boundary.js +256 -0
- package/dist/core/pipeline/contain.d.ts +122 -0
- package/dist/core/pipeline/contain.js +339 -0
- package/dist/core/pipeline/index.d.ts +16 -0
- package/dist/core/pipeline/index.js +37 -0
- package/dist/core/pipeline/normalize.d.ts +34 -0
- package/dist/core/pipeline/normalize.js +76 -0
- package/dist/core/pipeline/parse.d.ts +40 -0
- package/dist/core/pipeline/parse.js +91 -0
- package/dist/core/pipeline/pipeline.d.ts +23 -0
- package/dist/core/pipeline/pipeline.js +418 -0
- package/dist/core/pipeline/scan.d.ts +46 -0
- package/dist/core/pipeline/scan.js +115 -0
- package/dist/core/pipeline/validate.d.ts +40 -0
- package/dist/core/pipeline/validate.js +74 -0
- package/dist/core/scanners/any/scan-for-sentinels.d.ts +19 -0
- package/dist/core/scanners/any/scan-for-sentinels.js +35 -0
- package/dist/core/scanners/array/array-is-deep.d.ts +19 -0
- package/dist/core/scanners/array/array-is-deep.js +38 -0
- package/dist/core/scanners/array/array-is-heterogenous.d.ts +18 -0
- package/dist/core/scanners/array/array-is-heterogenous.js +39 -0
- package/dist/core/scanners/array/array-is-large.d.ts +19 -0
- package/dist/core/scanners/array/array-is-large.js +32 -0
- package/dist/core/scanners/bigint/bigint-is-large.d.ts +20 -0
- package/dist/core/scanners/bigint/bigint-is-large.js +34 -0
- package/dist/core/scanners/bigint/bigint-not-safe.d.ts +20 -0
- package/dist/core/scanners/bigint/bigint-not-safe.js +34 -0
- package/dist/core/scanners/date/date-is-before-epoch.d.ts +19 -0
- package/dist/core/scanners/date/date-is-before-epoch.js +32 -0
- package/dist/core/scanners/date/date-is-far-future.d.ts +19 -0
- package/dist/core/scanners/date/date-is-far-future.js +32 -0
- package/dist/core/scanners/date/date-is-invalid.d.ts +19 -0
- package/dist/core/scanners/date/date-is-invalid.js +31 -0
- package/dist/core/scanners/index.d.ts +31 -0
- package/dist/core/scanners/index.js +58 -0
- package/dist/core/scanners/number/number-is-infinite.d.ts +19 -0
- package/dist/core/scanners/number/number-is-infinite.js +31 -0
- package/dist/core/scanners/number/number-is-nan.d.ts +19 -0
- package/dist/core/scanners/number/number-is-nan.js +31 -0
- package/dist/core/scanners/number/number-is-too-large.d.ts +20 -0
- package/dist/core/scanners/number/number-is-too-large.js +33 -0
- package/dist/core/scanners/number/number-is-unsafe-integer.d.ts +19 -0
- package/dist/core/scanners/number/number-is-unsafe-integer.js +31 -0
- package/dist/core/scanners/object/object-has-circular-references.d.ts +20 -0
- package/dist/core/scanners/object/object-has-circular-references.js +43 -0
- package/dist/core/scanners/object/object-has-many-keys.d.ts +19 -0
- package/dist/core/scanners/object/object-has-many-keys.js +33 -0
- package/dist/core/scanners/object/object-is-deep.d.ts +20 -0
- package/dist/core/scanners/object/object-is-deep.js +38 -0
- package/dist/core/scanners/scanner-registry.d.ts +19 -0
- package/dist/core/scanners/scanner-registry.js +36 -0
- package/dist/core/scanners/string/string-has-unsafe-unicode.d.ts +19 -0
- package/dist/core/scanners/string/string-has-unsafe-unicode.js +32 -0
- package/dist/core/scanners/string/string-has-whitespace-edges.d.ts +19 -0
- package/dist/core/scanners/string/string-has-whitespace-edges.js +31 -0
- package/dist/core/scanners/string/string-is-long.d.ts +19 -0
- package/dist/core/scanners/string/string-is-long.js +32 -0
- package/dist/core/scanners/unknown/unknown-not-scannable.d.ts +21 -0
- package/dist/core/scanners/unknown/unknown-not-scannable.js +34 -0
- package/dist/core/shapes/analysis.d.ts +239 -0
- package/dist/core/shapes/analysis.js +11 -0
- package/dist/core/shapes/boundary.d.ts +126 -0
- package/dist/core/shapes/boundary.js +11 -0
- package/dist/core/shapes/events.d.ts +83 -0
- package/dist/core/shapes/events.js +10 -0
- package/dist/core/shapes/field-path.d.ts +51 -0
- package/dist/core/shapes/field-path.js +10 -0
- package/dist/core/shapes/index.d.ts +21 -0
- package/dist/core/shapes/index.js +11 -0
- package/dist/core/shapes/normalize.d.ts +59 -0
- package/dist/core/shapes/normalize.js +11 -0
- package/dist/core/shapes/parse.d.ts +75 -0
- package/dist/core/shapes/parse.js +11 -0
- package/dist/core/shapes/pipeline.d.ts +149 -0
- package/dist/core/shapes/pipeline.js +11 -0
- package/dist/core/shapes/policy.d.ts +158 -0
- package/dist/core/shapes/policy.js +11 -0
- package/dist/core/shapes/public.d.ts +92 -0
- package/dist/core/shapes/public.js +10 -0
- package/dist/core/shapes/scan.d.ts +126 -0
- package/dist/core/shapes/scan.js +11 -0
- package/dist/core/shapes/validate.d.ts +65 -0
- package/dist/core/shapes/validate.js +11 -0
- package/dist/core/validators/array/array-max-items.d.ts +25 -0
- package/dist/core/validators/array/array-max-items.js +42 -0
- package/dist/core/validators/array/array-min-items.d.ts +25 -0
- package/dist/core/validators/array/array-min-items.js +42 -0
- package/dist/core/validators/array/array.d.ts +22 -0
- package/dist/core/validators/array/array.js +34 -0
- package/dist/core/validators/array/excludes.d.ts +25 -0
- package/dist/core/validators/array/excludes.js +47 -0
- package/dist/core/validators/array/has-unique-items.d.ts +24 -0
- package/dist/core/validators/array/has-unique-items.js +46 -0
- package/dist/core/validators/array/includes.d.ts +24 -0
- package/dist/core/validators/array/includes.js +46 -0
- package/dist/core/validators/array/items-equal.d.ts +25 -0
- package/dist/core/validators/array/items-equal.js +42 -0
- package/dist/core/validators/array/no-empty-string-items.d.ts +24 -0
- package/dist/core/validators/array/no-empty-string-items.js +46 -0
- package/dist/core/validators/array/no-null-items.d.ts +24 -0
- package/dist/core/validators/array/no-null-items.js +46 -0
- package/dist/core/validators/array/no-undefined-items.d.ts +24 -0
- package/dist/core/validators/array/no-undefined-items.js +45 -0
- package/dist/core/validators/array/non-empty-array.d.ts +24 -0
- package/dist/core/validators/array/non-empty-array.js +45 -0
- package/dist/core/validators/array/not-sparse.d.ts +25 -0
- package/dist/core/validators/array/not-sparse.js +44 -0
- package/dist/core/validators/bigint/bigint-equals.d.ts +24 -0
- package/dist/core/validators/bigint/bigint-equals.js +57 -0
- package/dist/core/validators/bigint/bigint-max.d.ts +25 -0
- package/dist/core/validators/bigint/bigint-max.js +63 -0
- package/dist/core/validators/bigint/bigint-min.d.ts +25 -0
- package/dist/core/validators/bigint/bigint-min.js +87 -0
- package/dist/core/validators/bigint/bigint-negative.d.ts +23 -0
- package/dist/core/validators/bigint/bigint-negative.js +73 -0
- package/dist/core/validators/bigint/bigint-non-negative.d.ts +24 -0
- package/dist/core/validators/bigint/bigint-non-negative.js +72 -0
- package/dist/core/validators/bigint/bigint-non-positive.d.ts +24 -0
- package/dist/core/validators/bigint/bigint-non-positive.js +72 -0
- package/dist/core/validators/bigint/bigint-positive.d.ts +24 -0
- package/dist/core/validators/bigint/bigint-positive.js +72 -0
- package/dist/core/validators/bigint/bigint-safe.d.ts +25 -0
- package/dist/core/validators/bigint/bigint-safe.js +75 -0
- package/dist/core/validators/bigint/bigint.d.ts +20 -0
- package/dist/core/validators/bigint/bigint.js +38 -0
- package/dist/core/validators/boolean/boolean.d.ts +21 -0
- package/dist/core/validators/boolean/boolean.js +39 -0
- package/dist/core/validators/boolean/is-false.d.ts +22 -0
- package/dist/core/validators/boolean/is-false.js +48 -0
- package/dist/core/validators/boolean/is-true.d.ts +22 -0
- package/dist/core/validators/boolean/is-true.js +48 -0
- package/dist/core/validators/common/is-country-code.d.ts +17 -0
- package/dist/core/validators/common/is-country-code.js +36 -0
- package/dist/core/validators/common/is-currency-code.d.ts +17 -0
- package/dist/core/validators/common/is-currency-code.js +36 -0
- package/dist/core/validators/common/is-email-strict.d.ts +17 -0
- package/dist/core/validators/common/is-email-strict.js +36 -0
- package/dist/core/validators/common/is-email.d.ts +17 -0
- package/dist/core/validators/common/is-email.js +36 -0
- package/dist/core/validators/common/is-ip.d.ts +17 -0
- package/dist/core/validators/common/is-ip.js +37 -0
- package/dist/core/validators/common/is-phone-strict.d.ts +17 -0
- package/dist/core/validators/common/is-phone-strict.js +36 -0
- package/dist/core/validators/common/is-phone.d.ts +17 -0
- package/dist/core/validators/common/is-phone.js +36 -0
- package/dist/core/validators/common/is-port.d.ts +17 -0
- package/dist/core/validators/common/is-port.js +35 -0
- package/dist/core/validators/common/is-postal-code.d.ts +17 -0
- package/dist/core/validators/common/is-postal-code.js +36 -0
- package/dist/core/validators/common/is-url.d.ts +17 -0
- package/dist/core/validators/common/is-url.js +38 -0
- package/dist/core/validators/common/is-uuid.d.ts +17 -0
- package/dist/core/validators/common/is-uuid.js +36 -0
- package/dist/core/validators/date/before-epoch.d.ts +28 -0
- package/dist/core/validators/date/before-epoch.js +56 -0
- package/dist/core/validators/date/date-now-required.d.ts +22 -0
- package/dist/core/validators/date/date-now-required.js +48 -0
- package/dist/core/validators/date/is-date.d.ts +21 -0
- package/dist/core/validators/date/is-date.js +47 -0
- package/dist/core/validators/date/is-far-future.d.ts +23 -0
- package/dist/core/validators/date/is-far-future.js +46 -0
- package/dist/core/validators/date/is-future.d.ts +24 -0
- package/dist/core/validators/date/is-future.js +59 -0
- package/dist/core/validators/date/is-past.d.ts +24 -0
- package/dist/core/validators/date/is-past.js +59 -0
- package/dist/core/validators/date/not-after.d.ts +25 -0
- package/dist/core/validators/date/not-after.js +66 -0
- package/dist/core/validators/date/not-before.d.ts +25 -0
- package/dist/core/validators/date/not-before.js +66 -0
- package/dist/core/validators/date/same-day.d.ts +25 -0
- package/dist/core/validators/date/same-day.js +60 -0
- package/dist/core/validators/date/same-month.d.ts +25 -0
- package/dist/core/validators/date/same-month.js +59 -0
- package/dist/core/validators/date/same-year.d.ts +24 -0
- package/dist/core/validators/date/same-year.js +56 -0
- package/dist/core/validators/date/too-early.d.ts +25 -0
- package/dist/core/validators/date/too-early.js +57 -0
- package/dist/core/validators/date/too-late.d.ts +25 -0
- package/dist/core/validators/date/too-late.js +57 -0
- package/dist/core/validators/date/weekday.d.ts +32 -0
- package/dist/core/validators/date/weekday.js +65 -0
- package/dist/core/validators/date/weekend.d.ts +27 -0
- package/dist/core/validators/date/weekend.js +56 -0
- package/dist/core/validators/index.d.ts +112 -0
- package/dist/core/validators/index.js +139 -0
- package/dist/core/validators/nullish/is-null-or-undefined.d.ts +22 -0
- package/dist/core/validators/nullish/is-null-or-undefined.js +40 -0
- package/dist/core/validators/nullish/is-null.d.ts +21 -0
- package/dist/core/validators/nullish/is-null.js +39 -0
- package/dist/core/validators/nullish/is-undefined.d.ts +21 -0
- package/dist/core/validators/nullish/is-undefined.js +39 -0
- package/dist/core/validators/number/finite.d.ts +22 -0
- package/dist/core/validators/number/finite.js +40 -0
- package/dist/core/validators/number/integer.d.ts +22 -0
- package/dist/core/validators/number/integer.js +40 -0
- package/dist/core/validators/number/less-than.d.ts +21 -0
- package/dist/core/validators/number/less-than.js +39 -0
- package/dist/core/validators/number/max.d.ts +21 -0
- package/dist/core/validators/number/max.js +39 -0
- package/dist/core/validators/number/min.d.ts +21 -0
- package/dist/core/validators/number/min.js +39 -0
- package/dist/core/validators/number/more-than.d.ts +21 -0
- package/dist/core/validators/number/more-than.js +39 -0
- package/dist/core/validators/number/negative.d.ts +20 -0
- package/dist/core/validators/number/negative.js +38 -0
- package/dist/core/validators/number/non-negative.d.ts +19 -0
- package/dist/core/validators/number/non-negative.js +37 -0
- package/dist/core/validators/number/non-positive.d.ts +19 -0
- package/dist/core/validators/number/non-positive.js +37 -0
- package/dist/core/validators/number/number.d.ts +19 -0
- package/dist/core/validators/number/number.js +31 -0
- package/dist/core/validators/number/positive.d.ts +20 -0
- package/dist/core/validators/number/positive.js +38 -0
- package/dist/core/validators/number/safe-integer.d.ts +19 -0
- package/dist/core/validators/number/safe-integer.js +42 -0
- package/dist/core/validators/object/deep-equals.d.ts +24 -0
- package/dist/core/validators/object/deep-equals.js +47 -0
- package/dist/core/validators/object/has-key.d.ts +23 -0
- package/dist/core/validators/object/has-key.js +42 -0
- package/dist/core/validators/object/has-value.d.ts +27 -0
- package/dist/core/validators/object/has-value.js +59 -0
- package/dist/core/validators/object/keys-equal.d.ts +26 -0
- package/dist/core/validators/object/keys-equal.js +47 -0
- package/dist/core/validators/object/max-keys.d.ts +24 -0
- package/dist/core/validators/object/max-keys.js +43 -0
- package/dist/core/validators/object/min-keys.d.ts +24 -0
- package/dist/core/validators/object/min-keys.js +43 -0
- package/dist/core/validators/object/missing-key.d.ts +23 -0
- package/dist/core/validators/object/missing-key.js +42 -0
- package/dist/core/validators/object/no-empty-array-values.d.ts +23 -0
- package/dist/core/validators/object/no-empty-array-values.js +44 -0
- package/dist/core/validators/object/no-empty-object-values.d.ts +23 -0
- package/dist/core/validators/object/no-empty-object-values.js +44 -0
- package/dist/core/validators/object/no-null-values.d.ts +23 -0
- package/dist/core/validators/object/no-null-values.js +44 -0
- package/dist/core/validators/object/no-undefined-values.d.ts +23 -0
- package/dist/core/validators/object/no-undefined-values.js +44 -0
- package/dist/core/validators/object/non-empty-object.d.ts +21 -0
- package/dist/core/validators/object/non-empty-object.js +40 -0
- package/dist/core/validators/object/only-keys.d.ts +23 -0
- package/dist/core/validators/object/only-keys.js +43 -0
- package/dist/core/validators/object/plain-object.d.ts +22 -0
- package/dist/core/validators/object/plain-object.js +35 -0
- package/dist/core/validators/string/alpha-num.d.ts +23 -0
- package/dist/core/validators/string/alpha-num.js +50 -0
- package/dist/core/validators/string/alpha.d.ts +24 -0
- package/dist/core/validators/string/alpha.js +51 -0
- package/dist/core/validators/string/chars-equal.d.ts +23 -0
- package/dist/core/validators/string/chars-equal.js +49 -0
- package/dist/core/validators/string/ends-with.d.ts +23 -0
- package/dist/core/validators/string/ends-with.js +50 -0
- package/dist/core/validators/string/is-ascii.d.ts +24 -0
- package/dist/core/validators/string/is-ascii.js +53 -0
- package/dist/core/validators/string/is-printable.d.ts +25 -0
- package/dist/core/validators/string/is-printable.js +53 -0
- package/dist/core/validators/string/matches.d.ts +23 -0
- package/dist/core/validators/string/matches.js +50 -0
- package/dist/core/validators/string/max-length.d.ts +24 -0
- package/dist/core/validators/string/max-length.js +50 -0
- package/dist/core/validators/string/min-length.d.ts +24 -0
- package/dist/core/validators/string/min-length.js +50 -0
- package/dist/core/validators/string/no-lead-space.d.ts +23 -0
- package/dist/core/validators/string/no-lead-space.js +50 -0
- package/dist/core/validators/string/no-repeat-space.d.ts +25 -0
- package/dist/core/validators/string/no-repeat-space.js +52 -0
- package/dist/core/validators/string/no-space.d.ts +24 -0
- package/dist/core/validators/string/no-space.js +51 -0
- package/dist/core/validators/string/no-trail-space.d.ts +23 -0
- package/dist/core/validators/string/no-trail-space.js +50 -0
- package/dist/core/validators/string/non-empty.d.ts +22 -0
- package/dist/core/validators/string/non-empty.js +48 -0
- package/dist/core/validators/string/not-one-of.d.ts +24 -0
- package/dist/core/validators/string/not-one-of.js +51 -0
- package/dist/core/validators/string/num-string.d.ts +23 -0
- package/dist/core/validators/string/num-string.js +50 -0
- package/dist/core/validators/string/one-of.d.ts +23 -0
- package/dist/core/validators/string/one-of.js +50 -0
- package/dist/core/validators/string/starts-with.d.ts +23 -0
- package/dist/core/validators/string/starts-with.js +50 -0
- package/dist/core/validators/string/string.d.ts +21 -0
- package/dist/core/validators/string/string.js +39 -0
- package/dist/core/validators/string/trimmed.d.ts +24 -0
- package/dist/core/validators/string/trimmed.js +51 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.js +26 -0
- package/dist/test.d.ts +1 -0
- package/dist/test.js +12 -0
- package/package.json +2 -2
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Barrel File
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Re‑exports all scanner modules, providing a single,
|
|
7
|
+
* consolidated entry point for the scanning subsystem.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
12
|
+
|* All Values *|
|
|
13
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
14
|
+
export { scanForSentinels } from './any/scan-for-sentinels';
|
|
15
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
16
|
+
|* Array Values *|
|
|
17
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
18
|
+
export { arrayIsDeep } from './array/array-is-deep';
|
|
19
|
+
export { arrayIsHeterogeneous } from './array/array-is-heterogenous';
|
|
20
|
+
export { arrayIsLarge } from './array/array-is-large';
|
|
21
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
22
|
+
|* Bigint Values *|
|
|
23
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
24
|
+
export { bigintIsLarge } from './bigint/bigint-is-large';
|
|
25
|
+
export { bigintNotSafe } from './bigint/bigint-not-safe';
|
|
26
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
27
|
+
|* Date Values *|
|
|
28
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
29
|
+
export { dateIsBeforeEpoch } from './date/date-is-before-epoch';
|
|
30
|
+
export { dateIsFarFuture } from './date/date-is-far-future';
|
|
31
|
+
export { dateIsInvalid } from './date/date-is-invalid';
|
|
32
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
33
|
+
|* Number Values *|
|
|
34
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
35
|
+
export { numberIsInfinite } from './number/number-is-infinite';
|
|
36
|
+
export { numberIsNaN } from './number/number-is-nan';
|
|
37
|
+
export { numberIsTooLarge } from './number/number-is-too-large';
|
|
38
|
+
export { numberIsUnsafeInteger } from './number/number-is-unsafe-integer';
|
|
39
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
40
|
+
|* Object Values *|
|
|
41
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
42
|
+
export { objectHasCircularReferences } from './object/object-has-circular-references';
|
|
43
|
+
export { objectHasManyKeys } from './object/object-has-many-keys';
|
|
44
|
+
export { objectIsDeep } from './object/object-is-deep';
|
|
45
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
46
|
+
|* String Values *|
|
|
47
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
48
|
+
export { stringHasUnsafeUnicode } from './string/string-has-unsafe-unicode';
|
|
49
|
+
export { stringHasWhitespaceEdges } from './string/string-has-whitespace-edges';
|
|
50
|
+
export { stringIsLong } from './string/string-is-long';
|
|
51
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
52
|
+
|* Unknown Values *|
|
|
53
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
54
|
+
export { unknownNotScannable } from './unknown/unknown-not-scannable';
|
|
55
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
56
|
+
|* Registry *|
|
|
57
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
58
|
+
export { scanRuleRegistry } from './scanner-registry';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Number Is Infinite
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Flags numeric values that resolve to Infinity, surfacing
|
|
7
|
+
* calculation errors or malformed inputs before they propagate.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import type { ScanRule } from '../../shapes';
|
|
12
|
+
/**
|
|
13
|
+
* Flags numeric values that are infinite rather than finite.
|
|
14
|
+
*
|
|
15
|
+
* Infinite values often indicate upstream calculation errors, division
|
|
16
|
+
* anomalies, or malformed input. This rule surfaces them early so downstream
|
|
17
|
+
* logic never assumes a safe, bounded number.
|
|
18
|
+
*/
|
|
19
|
+
export declare const numberIsInfinite: ScanRule;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Number Is Infinite
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Flags numeric values that resolve to Infinity, surfacing
|
|
7
|
+
* calculation errors or malformed inputs before they propagate.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import { scanEvent } from '../../pipeline';
|
|
12
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
13
|
+
|* Implementation *|
|
|
14
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
15
|
+
/**
|
|
16
|
+
* Flags numeric values that are infinite rather than finite.
|
|
17
|
+
*
|
|
18
|
+
* Infinite values often indicate upstream calculation errors, division
|
|
19
|
+
* anomalies, or malformed input. This rule surfaces them early so downstream
|
|
20
|
+
* logic never assumes a safe, bounded number.
|
|
21
|
+
*/
|
|
22
|
+
export const numberIsInfinite = (raw, path) => {
|
|
23
|
+
if (typeof raw !== 'number')
|
|
24
|
+
return [];
|
|
25
|
+
if (!Number.isFinite(raw)) {
|
|
26
|
+
return [
|
|
27
|
+
scanEvent('warn', 'number.not.finite', path, 'Value is infinite, which is not a safe numeric value.', 'This number is infinite.', { value: raw }),
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
return [];
|
|
31
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Number Is NaN
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Detects numeric values that evaluate to NaN, ensuring failed
|
|
7
|
+
* arithmetic or parsing does not silently pass through scanning.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import type { ScanRule } from '../../shapes';
|
|
12
|
+
/**
|
|
13
|
+
* Detects numeric values that resolve to NaN.
|
|
14
|
+
*
|
|
15
|
+
* NaN commonly arises from failed arithmetic, invalid parsing, or unexpected
|
|
16
|
+
* coercions. This rule ensures such values are treated as structurally unsafe
|
|
17
|
+
* rather than silently propagating through the scan pipeline.
|
|
18
|
+
*/
|
|
19
|
+
export declare const numberIsNaN: ScanRule;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Number Is NaN
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Detects numeric values that evaluate to NaN, ensuring failed
|
|
7
|
+
* arithmetic or parsing does not silently pass through scanning.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import { scanEvent } from '../../pipeline';
|
|
12
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
13
|
+
|* Implementation *|
|
|
14
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
15
|
+
/**
|
|
16
|
+
* Detects numeric values that resolve to NaN.
|
|
17
|
+
*
|
|
18
|
+
* NaN commonly arises from failed arithmetic, invalid parsing, or unexpected
|
|
19
|
+
* coercions. This rule ensures such values are treated as structurally unsafe
|
|
20
|
+
* rather than silently propagating through the scan pipeline.
|
|
21
|
+
*/
|
|
22
|
+
export const numberIsNaN = (raw, path) => {
|
|
23
|
+
if (typeof raw !== 'number')
|
|
24
|
+
return [];
|
|
25
|
+
if (Number.isNaN(raw)) {
|
|
26
|
+
return [
|
|
27
|
+
scanEvent('warn', 'number.not.number', path, 'Value is NaN, which is not a safe numeric value.', 'This number is not valid.', { value: raw }),
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
return [];
|
|
31
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Number Is Too Large
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Warns when a number exceeds a conservative magnitude limit,
|
|
7
|
+
* highlighting values that may indicate corrupted or adversarial
|
|
8
|
+
* input.
|
|
9
|
+
* @see https://jane-io.com
|
|
10
|
+
* ----------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
import type { ScanRule } from '../../shapes';
|
|
13
|
+
/**
|
|
14
|
+
* Warns when a numeric value exceeds a conservative magnitude threshold.
|
|
15
|
+
*
|
|
16
|
+
* Extremely large numbers can signal corrupted data, unrealistic inputs, or
|
|
17
|
+
* adversarial payloads. This rule highlights values that may cause overflow,
|
|
18
|
+
* precision loss, or performance issues in downstream systems.
|
|
19
|
+
*/
|
|
20
|
+
export declare const numberIsTooLarge: ScanRule;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Number Is Too Large
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Warns when a number exceeds a conservative magnitude limit,
|
|
7
|
+
* highlighting values that may indicate corrupted or adversarial
|
|
8
|
+
* input.
|
|
9
|
+
* @see https://jane-io.com
|
|
10
|
+
* ----------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
import { scanEvent } from '../../pipeline';
|
|
13
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
14
|
+
|* Implementation *|
|
|
15
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
16
|
+
/**
|
|
17
|
+
* Warns when a numeric value exceeds a conservative magnitude threshold.
|
|
18
|
+
*
|
|
19
|
+
* Extremely large numbers can signal corrupted data, unrealistic inputs, or
|
|
20
|
+
* adversarial payloads. This rule highlights values that may cause overflow,
|
|
21
|
+
* precision loss, or performance issues in downstream systems.
|
|
22
|
+
*/
|
|
23
|
+
export const numberIsTooLarge = (raw, path) => {
|
|
24
|
+
if (typeof raw !== 'number')
|
|
25
|
+
return [];
|
|
26
|
+
const max = 1e15;
|
|
27
|
+
if (Math.abs(raw) > max) {
|
|
28
|
+
return [
|
|
29
|
+
scanEvent('warn', 'number.is.too-large', path, `Number magnitude ${raw} exceeds safe threshold ${max}.`, 'This number is extremely large.', { value: raw, max }),
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
return [];
|
|
33
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Number Is Unsafe Integer
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Flags integers outside JavaScript’s safe integer range,
|
|
7
|
+
* preventing precision‑loss issues in comparisons or arithmetic.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import type { ScanRule } from '../../shapes';
|
|
12
|
+
/**
|
|
13
|
+
* Flags integers that fall outside JavaScript’s safe integer range.
|
|
14
|
+
*
|
|
15
|
+
* Values beyond the safe range cannot be represented precisely using standard
|
|
16
|
+
* numeric operations. This rule surfaces whole numbers that may behave
|
|
17
|
+
* unpredictably in comparisons, arithmetic, or serialization.
|
|
18
|
+
*/
|
|
19
|
+
export declare const numberIsUnsafeInteger: ScanRule;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Number Is Unsafe Integer
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Flags integers outside JavaScript’s safe integer range,
|
|
7
|
+
* preventing precision‑loss issues in comparisons or arithmetic.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import { scanEvent } from '../../pipeline';
|
|
12
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
13
|
+
|* Implementation *|
|
|
14
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
15
|
+
/**
|
|
16
|
+
* Flags integers that fall outside JavaScript’s safe integer range.
|
|
17
|
+
*
|
|
18
|
+
* Values beyond the safe range cannot be represented precisely using standard
|
|
19
|
+
* numeric operations. This rule surfaces whole numbers that may behave
|
|
20
|
+
* unpredictably in comparisons, arithmetic, or serialization.
|
|
21
|
+
*/
|
|
22
|
+
export const numberIsUnsafeInteger = (raw, path) => {
|
|
23
|
+
if (typeof raw !== 'number')
|
|
24
|
+
return [];
|
|
25
|
+
if (Number.isInteger(raw) && !Number.isSafeInteger(raw)) {
|
|
26
|
+
return [
|
|
27
|
+
scanEvent('warn', 'number.not.safe-integer', path, `Integer ${raw} exceeds JavaScript's safe integer range.`, 'This whole number is outside the safe range.', { value: raw }),
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
return [];
|
|
31
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Object Has Circular References
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Detects self‑referential object graphs that can break
|
|
7
|
+
* serializers, confuse diffing logic, or trigger unbounded
|
|
8
|
+
* recursion during analysis.
|
|
9
|
+
* @see https://jane-io.com
|
|
10
|
+
* ----------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
import type { ScanRule } from '../../shapes';
|
|
13
|
+
/**
|
|
14
|
+
* Detects objects that contain circular references.
|
|
15
|
+
*
|
|
16
|
+
* Cyclic structures can break serializers, confuse diffing logic, and cause
|
|
17
|
+
* unbounded recursion during analysis. This rule surfaces self‑referential
|
|
18
|
+
* shapes early so containment and policy layers can respond safely.
|
|
19
|
+
*/
|
|
20
|
+
export declare const objectHasCircularReferences: ScanRule;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Object Has Circular References
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Detects self‑referential object graphs that can break
|
|
7
|
+
* serializers, confuse diffing logic, or trigger unbounded
|
|
8
|
+
* recursion during analysis.
|
|
9
|
+
* @see https://jane-io.com
|
|
10
|
+
* ----------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
import { scanEvent } from '../../pipeline';
|
|
13
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
14
|
+
|* Implementation *|
|
|
15
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
16
|
+
/**
|
|
17
|
+
* Detects objects that contain circular references.
|
|
18
|
+
*
|
|
19
|
+
* Cyclic structures can break serializers, confuse diffing logic, and cause
|
|
20
|
+
* unbounded recursion during analysis. This rule surfaces self‑referential
|
|
21
|
+
* shapes early so containment and policy layers can respond safely.
|
|
22
|
+
*/
|
|
23
|
+
export const objectHasCircularReferences = (raw, path) => {
|
|
24
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
25
|
+
return [];
|
|
26
|
+
const seen = new WeakSet();
|
|
27
|
+
const stack = [raw];
|
|
28
|
+
while (stack.length > 0) {
|
|
29
|
+
const current = stack.pop();
|
|
30
|
+
if (seen.has(current)) {
|
|
31
|
+
return [
|
|
32
|
+
scanEvent('warn', 'object.has.circular-references', path, 'Object contains circular references.', 'This object refers to itself.', {}),
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
seen.add(current);
|
|
36
|
+
for (const value of Object.values(current)) {
|
|
37
|
+
if (value && typeof value === 'object') {
|
|
38
|
+
stack.push(value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return [];
|
|
43
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Object Has Many Keys
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Flags objects whose number of own properties exceeds a safe
|
|
7
|
+
* threshold, surfacing unusually wide or adversarial shapes.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import type { ScanRule } from '../../shapes';
|
|
12
|
+
/**
|
|
13
|
+
* Flags objects whose number of own enumerable keys exceeds a safe limit.
|
|
14
|
+
*
|
|
15
|
+
* Extremely wide objects often indicate malformed payloads, accidental
|
|
16
|
+
* fan‑out, or adversarial input. This rule highlights unusually large
|
|
17
|
+
* property maps before they stress memory or downstream processing.
|
|
18
|
+
*/
|
|
19
|
+
export declare const objectHasManyKeys: ScanRule;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Object Has Many Keys
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Flags objects whose number of own properties exceeds a safe
|
|
7
|
+
* threshold, surfacing unusually wide or adversarial shapes.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import { scanEvent } from '../../pipeline';
|
|
12
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
13
|
+
|* Implementation *|
|
|
14
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
15
|
+
/**
|
|
16
|
+
* Flags objects whose number of own enumerable keys exceeds a safe limit.
|
|
17
|
+
*
|
|
18
|
+
* Extremely wide objects often indicate malformed payloads, accidental
|
|
19
|
+
* fan‑out, or adversarial input. This rule highlights unusually large
|
|
20
|
+
* property maps before they stress memory or downstream processing.
|
|
21
|
+
*/
|
|
22
|
+
export const objectHasManyKeys = (raw, path) => {
|
|
23
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
24
|
+
return [];
|
|
25
|
+
const maxKeys = 500;
|
|
26
|
+
const count = Object.keys(raw).length;
|
|
27
|
+
if (count > maxKeys) {
|
|
28
|
+
return [
|
|
29
|
+
scanEvent('warn', 'object.has.many-keys', path, `Object has ${count} keys, exceeding safe threshold ${maxKeys}.`, 'This object has many properties.', { count, maxKeys }),
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
return [];
|
|
33
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Object Is Deep
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Warns when an object’s nesting depth surpasses a conservative
|
|
7
|
+
* structural limit, highlighting shapes that may cause stack
|
|
8
|
+
* pressure or pathological traversal costs.
|
|
9
|
+
* @see https://jane-io.com
|
|
10
|
+
* ----------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
import type { ScanRule } from '../../shapes';
|
|
13
|
+
/**
|
|
14
|
+
* Warns when an object’s nesting depth exceeds a conservative structural bound.
|
|
15
|
+
*
|
|
16
|
+
* Deeply nested shapes can cause stack pressure, slow traversal, and
|
|
17
|
+
* pathological input patterns. This rule surfaces excessive depth early so
|
|
18
|
+
* containment can replace or constrain hazardous structures.
|
|
19
|
+
*/
|
|
20
|
+
export declare const objectIsDeep: ScanRule;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | Object Is Deep
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Warns when an object’s nesting depth surpasses a conservative
|
|
7
|
+
* structural limit, highlighting shapes that may cause stack
|
|
8
|
+
* pressure or pathological traversal costs.
|
|
9
|
+
* @see https://jane-io.com
|
|
10
|
+
* ----------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
13
|
+
|* Internal Modules *|
|
|
14
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
15
|
+
import { measureDepth } from '../../../core/pipeline';
|
|
16
|
+
import { scanEvent } from '../../pipeline';
|
|
17
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
18
|
+
|* Implementation *|
|
|
19
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
20
|
+
/**
|
|
21
|
+
* Warns when an object’s nesting depth exceeds a conservative structural bound.
|
|
22
|
+
*
|
|
23
|
+
* Deeply nested shapes can cause stack pressure, slow traversal, and
|
|
24
|
+
* pathological input patterns. This rule surfaces excessive depth early so
|
|
25
|
+
* containment can replace or constrain hazardous structures.
|
|
26
|
+
*/
|
|
27
|
+
export const objectIsDeep = (raw, path) => {
|
|
28
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
29
|
+
return [];
|
|
30
|
+
const depth = measureDepth(raw);
|
|
31
|
+
const max = 50;
|
|
32
|
+
if (depth > max) {
|
|
33
|
+
return [
|
|
34
|
+
scanEvent('warn', 'object.is.deep', path, `Object depth ${depth} exceeds safe threshold ${max}.`, 'This object is deeply nested.', { depth, max }),
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
return [];
|
|
38
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Public | Scanner Registry
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Exposes the full mapping of structural types to their
|
|
7
|
+
* associated scan rules, defining Jane’s public scanning
|
|
8
|
+
* configuration surface.
|
|
9
|
+
* @see https://jane-io.com
|
|
10
|
+
* ----------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
import type { ScanRuleSet } from '../shapes';
|
|
13
|
+
/**
|
|
14
|
+
* Central registry mapping structural types to the scan rules that evaluate
|
|
15
|
+
* them. This defines the composition and ordering of Jane’s scanning pipeline,
|
|
16
|
+
* ensuring each detected type is checked against the appropriate structural,
|
|
17
|
+
* safety, and shape‑integrity rules.
|
|
18
|
+
*/
|
|
19
|
+
export declare const scanRuleRegistry: ScanRuleSet;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Public | Scanner Registry
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Exposes the full mapping of structural types to their
|
|
7
|
+
* associated scan rules, defining Jane’s public scanning
|
|
8
|
+
* configuration surface.
|
|
9
|
+
* @see https://jane-io.com
|
|
10
|
+
* ----------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
import { arrayIsDeep, arrayIsHeterogeneous, arrayIsLarge, bigintIsLarge, bigintNotSafe, dateIsBeforeEpoch, dateIsFarFuture, dateIsInvalid, numberIsInfinite, numberIsNaN, numberIsTooLarge, numberIsUnsafeInteger, objectHasCircularReferences, objectHasManyKeys, objectIsDeep, scanForSentinels, stringHasUnsafeUnicode, stringHasWhitespaceEdges, stringIsLong, unknownNotScannable, } from '.';
|
|
13
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
14
|
+
|* Scan Rule Registry *|
|
|
15
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
16
|
+
/**
|
|
17
|
+
* Central registry mapping structural types to the scan rules that evaluate
|
|
18
|
+
* them. This defines the composition and ordering of Jane’s scanning pipeline,
|
|
19
|
+
* ensuring each detected type is checked against the appropriate structural,
|
|
20
|
+
* safety, and shape‑integrity rules.
|
|
21
|
+
*/
|
|
22
|
+
export const scanRuleRegistry = {
|
|
23
|
+
all: [scanForSentinels],
|
|
24
|
+
string: [stringIsLong, stringHasUnsafeUnicode, stringHasWhitespaceEdges],
|
|
25
|
+
number: [numberIsInfinite, numberIsNaN, numberIsTooLarge, numberIsUnsafeInteger],
|
|
26
|
+
boolean: [],
|
|
27
|
+
array: [arrayIsLarge, arrayIsDeep, arrayIsHeterogeneous],
|
|
28
|
+
object: [objectIsDeep, objectHasCircularReferences, objectHasManyKeys],
|
|
29
|
+
date: [dateIsInvalid, dateIsBeforeEpoch, dateIsFarFuture],
|
|
30
|
+
unknown: [unknownNotScannable],
|
|
31
|
+
/**
|
|
32
|
+
* The following types can only be accepted by explicitly setting the
|
|
33
|
+
* `bigint`, `set`, or `map` property (in `exceptions`) to `true`.
|
|
34
|
+
*/
|
|
35
|
+
bigint: [bigintIsLarge, bigintNotSafe],
|
|
36
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | String Has Unsafe Unicode
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Detects Unicode bidi control characters that can obscure
|
|
7
|
+
* text rendering or introduce security‑relevant ambiguity.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import type { ScanRule } from '../../shapes';
|
|
12
|
+
/**
|
|
13
|
+
* Detects the presence of Unicode bidi control characters.
|
|
14
|
+
*
|
|
15
|
+
* These invisible characters can alter text rendering, obscure intent, or
|
|
16
|
+
* introduce security risks. This rule surfaces unsafe Unicode so downstream
|
|
17
|
+
* layers never operate on misleading or adversarial text.
|
|
18
|
+
*/
|
|
19
|
+
export declare const stringHasUnsafeUnicode: ScanRule;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | String Has Unsafe Unicode
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Detects Unicode bidi control characters that can obscure
|
|
7
|
+
* text rendering or introduce security‑relevant ambiguity.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import { scanEvent } from '../../pipeline';
|
|
12
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
13
|
+
|* Implementation *|
|
|
14
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
15
|
+
/**
|
|
16
|
+
* Detects the presence of Unicode bidi control characters.
|
|
17
|
+
*
|
|
18
|
+
* These invisible characters can alter text rendering, obscure intent, or
|
|
19
|
+
* introduce security risks. This rule surfaces unsafe Unicode so downstream
|
|
20
|
+
* layers never operate on misleading or adversarial text.
|
|
21
|
+
*/
|
|
22
|
+
export const stringHasUnsafeUnicode = (raw, path) => {
|
|
23
|
+
if (typeof raw !== 'string')
|
|
24
|
+
return [];
|
|
25
|
+
const unsafe = /[\u202A\u202B\u202D\u202E\u202C\u2066\u2067\u2068\u2069]/;
|
|
26
|
+
if (unsafe.test(raw)) {
|
|
27
|
+
return [
|
|
28
|
+
scanEvent('warn', 'string.has.unsafe-unicode', path, 'String contains unsafe Unicode bidi control characters.', 'This text contains unsafe Unicode characters.', {}),
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
return [];
|
|
32
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | String Has Whitespace Edges
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Flags strings with leading or trailing whitespace, surfacing
|
|
7
|
+
* subtle formatting or input‑shape inconsistencies early.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import type { ScanRule } from '../../shapes';
|
|
12
|
+
/**
|
|
13
|
+
* Flags strings with leading or trailing whitespace.
|
|
14
|
+
*
|
|
15
|
+
* Edge whitespace often indicates accidental padding, formatting mistakes, or
|
|
16
|
+
* subtle input‑shape inconsistencies. This rule highlights those anomalies
|
|
17
|
+
* before normalization or policy logic is applied.
|
|
18
|
+
*/
|
|
19
|
+
export declare const stringHasWhitespaceEdges: ScanRule;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | String Has Whitespace Edges
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Flags strings with leading or trailing whitespace, surfacing
|
|
7
|
+
* subtle formatting or input‑shape inconsistencies early.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import { scanEvent } from '../../pipeline';
|
|
12
|
+
/* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
|
|
13
|
+
|* Implementation *|
|
|
14
|
+
\* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
|
|
15
|
+
/**
|
|
16
|
+
* Flags strings with leading or trailing whitespace.
|
|
17
|
+
*
|
|
18
|
+
* Edge whitespace often indicates accidental padding, formatting mistakes, or
|
|
19
|
+
* subtle input‑shape inconsistencies. This rule highlights those anomalies
|
|
20
|
+
* before normalization or policy logic is applied.
|
|
21
|
+
*/
|
|
22
|
+
export const stringHasWhitespaceEdges = (raw, path) => {
|
|
23
|
+
if (typeof raw !== 'string')
|
|
24
|
+
return [];
|
|
25
|
+
if (raw !== raw.trim()) {
|
|
26
|
+
return [
|
|
27
|
+
scanEvent('warn', 'string.has.whitespace-edges', path, 'String has leading or trailing whitespace.', 'This text has extra spaces at the edges.', { raw }),
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
return [];
|
|
31
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ----------------------------------------------------------------------------
|
|
3
|
+
* Scanners | String Is Long
|
|
4
|
+
* ----------------------------------------------------------------------------
|
|
5
|
+
* @package @clementine-solutions/jane
|
|
6
|
+
* @description Warns when text exceeds a conservative length threshold,
|
|
7
|
+
* highlighting oversized or potentially adversarial input.
|
|
8
|
+
* @see https://jane-io.com
|
|
9
|
+
* ----------------------------------------------------------------------------
|
|
10
|
+
*/
|
|
11
|
+
import type { ScanRule } from '../../shapes';
|
|
12
|
+
/**
|
|
13
|
+
* Warns when a string exceeds a conservative maximum length.
|
|
14
|
+
*
|
|
15
|
+
* Extremely long text can signal malformed payloads, denial‑of‑service
|
|
16
|
+
* attempts, or unbounded user input. This rule surfaces oversized strings
|
|
17
|
+
* early so containment and validation layers can respond safely.
|
|
18
|
+
*/
|
|
19
|
+
export declare const stringIsLong: ScanRule;
|