@kensio/smartass 1.15.0 → 1.17.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/README.md +2 -0
- package/dist/assert/array-includes/array-includes.assert.d.ts +3 -8
- package/dist/assert/array-includes/array-includes.assert.d.ts.map +1 -1
- package/dist/assert/array-includes/array-includes.assert.js.map +1 -1
- package/dist/assert/array-includes/array-includes.match.d.ts +1 -6
- package/dist/assert/array-includes/array-includes.match.d.ts.map +1 -1
- package/dist/assert/array-includes/array-includes.match.js +7 -1
- package/dist/assert/array-includes/array-includes.match.js.map +1 -1
- package/dist/assert/array-includes/array-includes.type.d.ts +44 -0
- package/dist/assert/array-includes/array-includes.type.d.ts.map +1 -0
- package/dist/assert/array-includes/array-includes.type.js +8 -0
- package/dist/assert/array-includes/array-includes.type.js.map +1 -0
- package/dist/assert/array-includes-all/array-includes-all.assert.d.ts +3 -7
- package/dist/assert/array-includes-all/array-includes-all.assert.d.ts.map +1 -1
- package/dist/assert/array-includes-all/array-includes-all.assert.js +27 -5
- package/dist/assert/array-includes-all/array-includes-all.assert.js.map +1 -1
- package/dist/assert/array-includes-all/array-includes-all.match.d.ts +3 -8
- package/dist/assert/array-includes-all/array-includes-all.match.d.ts.map +1 -1
- package/dist/assert/array-includes-all/array-includes-all.match.js +16 -3
- package/dist/assert/array-includes-all/array-includes-all.match.js.map +1 -1
- package/dist/assert/array-includes-all/array-includes-all.type.d.ts +51 -0
- package/dist/assert/array-includes-all/array-includes-all.type.d.ts.map +1 -0
- package/dist/assert/array-includes-all/array-includes-all.type.js +2 -0
- package/dist/assert/array-includes-all/array-includes-all.type.js.map +1 -0
- package/dist/assert/array-length/array-length.assert.d.ts +3 -9
- package/dist/assert/array-length/array-length.assert.d.ts.map +1 -1
- package/dist/assert/array-length/array-length.assert.js +7 -4
- package/dist/assert/array-length/array-length.assert.js.map +1 -1
- package/dist/assert/array-length/array-length.match.d.ts +1 -9
- package/dist/assert/array-length/array-length.match.d.ts.map +1 -1
- package/dist/assert/array-length/array-length.match.js +8 -2
- package/dist/assert/array-length/array-length.match.js.map +1 -1
- package/dist/assert/array-length/array-length.type.d.ts +37 -0
- package/dist/assert/array-length/array-length.type.d.ts.map +1 -0
- package/dist/assert/array-length/array-length.type.js +8 -0
- package/dist/assert/array-length/array-length.type.js.map +1 -0
- package/dist/assert/array-min-length/array-min-length.assert.d.ts +3 -9
- package/dist/assert/array-min-length/array-min-length.assert.d.ts.map +1 -1
- package/dist/assert/array-min-length/array-min-length.assert.js +10 -6
- package/dist/assert/array-min-length/array-min-length.assert.js.map +1 -1
- package/dist/assert/array-min-length/array-min-length.match.d.ts +1 -3
- package/dist/assert/array-min-length/array-min-length.match.d.ts.map +1 -1
- package/dist/assert/array-min-length/array-min-length.match.js +7 -1
- package/dist/assert/array-min-length/array-min-length.match.js.map +1 -1
- package/dist/assert/array-min-length/array-min-length.type.d.ts +35 -0
- package/dist/assert/array-min-length/array-min-length.type.d.ts.map +1 -0
- package/dist/assert/array-min-length/array-min-length.type.js +8 -0
- package/dist/assert/array-min-length/array-min-length.type.js.map +1 -0
- package/dist/assert/array-not-empty/array-not-empty.assert.d.ts +3 -5
- package/dist/assert/array-not-empty/array-not-empty.assert.d.ts.map +1 -1
- package/dist/assert/array-not-empty/array-not-empty.assert.js +8 -3
- package/dist/assert/array-not-empty/array-not-empty.assert.js.map +1 -1
- package/dist/assert/array-not-empty/array-not-empty.match.d.ts +1 -3
- package/dist/assert/array-not-empty/array-not-empty.match.d.ts.map +1 -1
- package/dist/assert/array-not-empty/array-not-empty.match.js +7 -1
- package/dist/assert/array-not-empty/array-not-empty.match.js.map +1 -1
- package/dist/assert/array-not-empty/array-not-empty.type.d.ts +35 -0
- package/dist/assert/array-not-empty/array-not-empty.type.d.ts.map +1 -0
- package/dist/assert/array-not-empty/array-not-empty.type.js +8 -0
- package/dist/assert/array-not-empty/array-not-empty.type.js.map +1 -0
- package/dist/assert/buffer-equal/buffer-equal.assert.d.ts +1 -1
- package/dist/assert/buffer-equal/buffer-equal.assert.d.ts.map +1 -1
- package/dist/assert/buffer-equal/buffer-equal.assert.js.map +1 -1
- package/dist/assert/buffer-equal/buffer-equal.match.d.ts +3 -3
- package/dist/assert/buffer-equal/buffer-equal.match.d.ts.map +1 -1
- package/dist/assert/buffer-equal/buffer-equal.match.js +20 -11
- package/dist/assert/buffer-equal/buffer-equal.match.js.map +1 -1
- package/dist/assert/buffer-equal/buffer-equal.type.d.ts +32 -0
- package/dist/assert/buffer-equal/buffer-equal.type.d.ts.map +1 -0
- package/dist/assert/buffer-equal/buffer-equal.type.js +8 -0
- package/dist/assert/buffer-equal/buffer-equal.type.js.map +1 -0
- package/dist/assert/identical/identical.assert.d.ts +1 -1
- package/dist/assert/identical/identical.assert.d.ts.map +1 -1
- package/dist/assert/instance-of/instance-of.assert.d.ts +3 -5
- package/dist/assert/instance-of/instance-of.assert.d.ts.map +1 -1
- package/dist/assert/instance-of/instance-of.assert.js.map +1 -1
- package/dist/assert/instance-of/instance-of.match.d.ts +2 -3
- package/dist/assert/instance-of/instance-of.match.d.ts.map +1 -1
- package/dist/assert/instance-of/instance-of.match.js +7 -1
- package/dist/assert/instance-of/instance-of.match.js.map +1 -1
- package/dist/assert/instance-of/instance-of.type.d.ts +42 -0
- package/dist/assert/instance-of/instance-of.type.d.ts.map +1 -0
- package/dist/assert/instance-of/instance-of.type.js +8 -0
- package/dist/assert/instance-of/instance-of.type.js.map +1 -0
- package/dist/assert/map-size/map-size.assert.d.ts +4 -0
- package/dist/assert/map-size/map-size.assert.d.ts.map +1 -0
- package/dist/assert/map-size/map-size.assert.js +19 -0
- package/dist/assert/map-size/map-size.assert.js.map +1 -0
- package/dist/assert/map-size/map-size.match.d.ts +6 -0
- package/dist/assert/map-size/map-size.match.d.ts.map +1 -0
- package/dist/assert/map-size/map-size.match.js +15 -0
- package/dist/assert/map-size/map-size.match.js.map +1 -0
- package/dist/assert/map-size/map-size.type.d.ts +33 -0
- package/dist/assert/map-size/map-size.type.d.ts.map +1 -0
- package/dist/assert/map-size/map-size.type.js +8 -0
- package/dist/assert/map-size/map-size.type.js.map +1 -0
- package/dist/assert/non-nullable/non-nullable.match.d.ts +2 -2
- package/dist/assert/non-nullable/non-nullable.match.d.ts.map +1 -1
- package/dist/assert/non-nullable/non-nullable.match.js.map +1 -1
- package/dist/assert/non-nullable/non-nullable.type.d.ts +5 -0
- package/dist/assert/non-nullable/non-nullable.type.d.ts.map +1 -0
- package/dist/assert/non-nullable/non-nullable.type.js +2 -0
- package/dist/assert/non-nullable/non-nullable.type.js.map +1 -0
- package/dist/assert/number-to-nearest/number-to-nearest.assert.d.ts +1 -1
- package/dist/assert/number-to-nearest/number-to-nearest.assert.d.ts.map +1 -1
- package/dist/assert/number-to-nearest/number-to-nearest.assert.js +2 -2
- package/dist/assert/number-to-nearest/number-to-nearest.assert.js.map +1 -1
- package/dist/assert/number-to-nearest/number-to-nearest.match.d.ts +1 -1
- package/dist/assert/number-to-nearest/number-to-nearest.match.d.ts.map +1 -1
- package/dist/assert/number-to-nearest/number-to-nearest.match.js +1 -1
- package/dist/assert/number-to-nearest/number-to-nearest.match.js.map +1 -1
- package/dist/assert/object-has-property/object-has-property.assert.d.ts +3 -6
- package/dist/assert/object-has-property/object-has-property.assert.d.ts.map +1 -1
- package/dist/assert/object-has-property/object-has-property.assert.js +1 -1
- package/dist/assert/object-has-property/object-has-property.assert.js.map +1 -1
- package/dist/assert/object-has-property/object-has-property.match.d.ts +1 -7
- package/dist/assert/object-has-property/object-has-property.match.d.ts.map +1 -1
- package/dist/assert/object-has-property/object-has-property.match.js +1 -1
- package/dist/assert/object-has-property/object-has-property.match.js.map +1 -1
- package/dist/assert/object-has-property/object-has-property.type.d.ts +8 -0
- package/dist/assert/object-has-property/object-has-property.type.d.ts.map +1 -0
- package/dist/assert/object-has-property/object-has-property.type.js +2 -0
- package/dist/assert/object-has-property/object-has-property.type.js.map +1 -0
- package/dist/assert/object-matches/object-matches.assert.d.ts +1 -28
- package/dist/assert/object-matches/object-matches.assert.d.ts.map +1 -1
- package/dist/assert/object-matches/object-matches.assert.js.map +1 -1
- package/dist/assert/object-matches/object-matches.type.d.ts +155 -0
- package/dist/assert/object-matches/object-matches.type.d.ts.map +1 -0
- package/dist/assert/object-matches/object-matches.type.js +2 -0
- package/dist/assert/object-matches/object-matches.type.js.map +1 -0
- package/dist/assert/one-of/one-of.assert.d.ts +5 -3
- package/dist/assert/one-of/one-of.assert.d.ts.map +1 -1
- package/dist/assert/one-of/one-of.assert.js.map +1 -1
- package/dist/assert/one-of/one-of.match.d.ts +2 -2
- package/dist/assert/one-of/one-of.match.d.ts.map +1 -1
- package/dist/assert/one-of/one-of.match.js +7 -1
- package/dist/assert/one-of/one-of.match.js.map +1 -1
- package/dist/assert/one-of/one-of.type.d.ts +33 -0
- package/dist/assert/one-of/one-of.type.d.ts.map +1 -0
- package/dist/assert/one-of/one-of.type.js +8 -0
- package/dist/assert/one-of/one-of.type.js.map +1 -0
- package/dist/assert/string-ends-with/string-ends-with.assert.d.ts +3 -4
- package/dist/assert/string-ends-with/string-ends-with.assert.d.ts.map +1 -1
- package/dist/assert/string-ends-with/string-ends-with.assert.js.map +1 -1
- package/dist/assert/string-ends-with/string-ends-with.match.d.ts +2 -2
- package/dist/assert/string-ends-with/string-ends-with.match.d.ts.map +1 -1
- package/dist/assert/string-ends-with/string-ends-with.match.js +7 -1
- package/dist/assert/string-ends-with/string-ends-with.match.js.map +1 -1
- package/dist/assert/string-ends-with/string-ends-with.type.d.ts +39 -0
- package/dist/assert/string-ends-with/string-ends-with.type.d.ts.map +1 -0
- package/dist/assert/string-ends-with/string-ends-with.type.js +8 -0
- package/dist/assert/string-ends-with/string-ends-with.type.js.map +1 -0
- package/dist/assert/string-includes/string-includes.assert.d.ts +3 -4
- package/dist/assert/string-includes/string-includes.assert.d.ts.map +1 -1
- package/dist/assert/string-includes/string-includes.assert.js.map +1 -1
- package/dist/assert/string-includes/string-includes.match.d.ts +2 -2
- package/dist/assert/string-includes/string-includes.match.d.ts.map +1 -1
- package/dist/assert/string-includes/string-includes.match.js +7 -1
- package/dist/assert/string-includes/string-includes.match.js.map +1 -1
- package/dist/assert/string-includes/string-includes.type.d.ts +39 -0
- package/dist/assert/string-includes/string-includes.type.d.ts.map +1 -0
- package/dist/assert/string-includes/string-includes.type.js +8 -0
- package/dist/assert/string-includes/string-includes.type.js.map +1 -0
- package/dist/assert/string-length/string-length.assert.d.ts +3 -14
- package/dist/assert/string-length/string-length.assert.d.ts.map +1 -1
- package/dist/assert/string-length/string-length.assert.js +7 -2
- package/dist/assert/string-length/string-length.assert.js.map +1 -1
- package/dist/assert/string-length/string-length.match.d.ts +1 -93
- package/dist/assert/string-length/string-length.match.d.ts.map +1 -1
- package/dist/assert/string-length/string-length.match.js +8 -2
- package/dist/assert/string-length/string-length.match.js.map +1 -1
- package/dist/assert/string-length/string-length.type.d.ts +132 -0
- package/dist/assert/string-length/string-length.type.d.ts.map +1 -0
- package/dist/assert/string-length/string-length.type.js +8 -0
- package/dist/assert/string-length/string-length.type.js.map +1 -0
- package/dist/assert/string-not-includes/string-not-includes.assert.d.ts +4 -4
- package/dist/assert/string-not-includes/string-not-includes.assert.d.ts.map +1 -1
- package/dist/assert/string-not-includes/string-not-includes.assert.js +7 -2
- package/dist/assert/string-not-includes/string-not-includes.assert.js.map +1 -1
- package/dist/assert/string-not-includes/string-not-includes.match.d.ts +2 -2
- package/dist/assert/string-not-includes/string-not-includes.match.d.ts.map +1 -1
- package/dist/assert/string-not-includes/string-not-includes.match.js +8 -2
- package/dist/assert/string-not-includes/string-not-includes.match.js.map +1 -1
- package/dist/assert/string-not-includes/string-not-includes.type.d.ts +30 -0
- package/dist/assert/string-not-includes/string-not-includes.type.d.ts.map +1 -0
- package/dist/assert/string-not-includes/string-not-includes.type.js +8 -0
- package/dist/assert/string-not-includes/string-not-includes.type.js.map +1 -0
- package/dist/assert/string-starts-with/string-starts-with.assert.d.ts +4 -4
- package/dist/assert/string-starts-with/string-starts-with.assert.d.ts.map +1 -1
- package/dist/assert/string-starts-with/string-starts-with.assert.js +7 -2
- package/dist/assert/string-starts-with/string-starts-with.assert.js.map +1 -1
- package/dist/assert/string-starts-with/string-starts-with.match.d.ts +2 -2
- package/dist/assert/string-starts-with/string-starts-with.match.d.ts.map +1 -1
- package/dist/assert/string-starts-with/string-starts-with.match.js +7 -1
- package/dist/assert/string-starts-with/string-starts-with.match.js.map +1 -1
- package/dist/assert/string-starts-with/string-starts-with.type.d.ts +39 -0
- package/dist/assert/string-starts-with/string-starts-with.type.d.ts.map +1 -0
- package/dist/assert/string-starts-with/string-starts-with.type.js +8 -0
- package/dist/assert/string-starts-with/string-starts-with.type.js.map +1 -0
- package/dist/assert/throws-error-like/throws-error-like.assert.d.ts +1 -5
- package/dist/assert/throws-error-like/throws-error-like.assert.d.ts.map +1 -1
- package/dist/assert/throws-error-like/throws-error-like.assert.js.map +1 -1
- package/dist/assert/throws-error-like/throws-error-like.type.d.ts +6 -0
- package/dist/assert/throws-error-like/throws-error-like.type.d.ts.map +1 -0
- package/dist/assert/throws-error-like/throws-error-like.type.js +2 -0
- package/dist/assert/throws-error-like/throws-error-like.type.js.map +1 -0
- package/dist/assert/type-bigint/type-bigint.match.d.ts +2 -2
- package/dist/assert/type-bigint/type-bigint.match.d.ts.map +1 -1
- package/dist/assert/type-bigint/type-bigint.match.js.map +1 -1
- package/dist/assert/type-bigint/type-bigint.type.d.ts +21 -0
- package/dist/assert/type-bigint/type-bigint.type.d.ts.map +1 -0
- package/dist/assert/type-bigint/type-bigint.type.js +2 -0
- package/dist/assert/type-bigint/type-bigint.type.js.map +1 -0
- package/dist/assert/type-boolean/type-boolean.match.d.ts +2 -2
- package/dist/assert/type-boolean/type-boolean.match.d.ts.map +1 -1
- package/dist/assert/type-boolean/type-boolean.match.js +7 -1
- package/dist/assert/type-boolean/type-boolean.match.js.map +1 -1
- package/dist/assert/type-boolean/type-boolean.type.d.ts +30 -0
- package/dist/assert/type-boolean/type-boolean.type.d.ts.map +1 -0
- package/dist/assert/type-boolean/type-boolean.type.js +9 -0
- package/dist/assert/type-boolean/type-boolean.type.js.map +1 -0
- package/dist/assert/type-function/type-function.assert.d.ts.map +1 -1
- package/dist/assert/type-function/type-function.assert.js.map +1 -1
- package/dist/assert/type-function/type-function.match.d.ts +2 -2
- package/dist/assert/type-function/type-function.match.d.ts.map +1 -1
- package/dist/assert/type-function/type-function.match.js +7 -4
- package/dist/assert/type-function/type-function.match.js.map +1 -1
- package/dist/assert/type-function/type-function.type.d.ts +29 -0
- package/dist/assert/type-function/type-function.type.d.ts.map +1 -0
- package/dist/assert/type-function/type-function.type.js +8 -0
- package/dist/assert/type-function/type-function.type.js.map +1 -0
- package/dist/assert/type-number/type-number.match.d.ts +2 -2
- package/dist/assert/type-number/type-number.match.d.ts.map +1 -1
- package/dist/assert/type-number/type-number.match.js +7 -1
- package/dist/assert/type-number/type-number.match.js.map +1 -1
- package/dist/assert/type-number/type-number.type.d.ts +30 -0
- package/dist/assert/type-number/type-number.type.d.ts.map +1 -0
- package/dist/assert/type-number/type-number.type.js +9 -0
- package/dist/assert/type-number/type-number.type.js.map +1 -0
- package/dist/assert/type-numeric/type-numeric.match.d.ts +2 -2
- package/dist/assert/type-numeric/type-numeric.match.d.ts.map +1 -1
- package/dist/assert/type-numeric/type-numeric.match.js +7 -1
- package/dist/assert/type-numeric/type-numeric.match.js.map +1 -1
- package/dist/assert/type-numeric/type-numeric.type.d.ts +33 -0
- package/dist/assert/type-numeric/type-numeric.type.d.ts.map +1 -0
- package/dist/assert/type-numeric/type-numeric.type.js +9 -0
- package/dist/assert/type-numeric/type-numeric.type.js.map +1 -0
- package/dist/assert/type-object/type-object.match.d.ts +2 -2
- package/dist/assert/type-object/type-object.match.d.ts.map +1 -1
- package/dist/assert/type-object/type-object.match.js +7 -1
- package/dist/assert/type-object/type-object.match.js.map +1 -1
- package/dist/assert/type-object/type-object.type.d.ts +33 -0
- package/dist/assert/type-object/type-object.type.d.ts.map +1 -0
- package/dist/assert/type-object/type-object.type.js +8 -0
- package/dist/assert/type-object/type-object.type.js.map +1 -0
- package/dist/assert/type-string/type-string.match.d.ts +2 -2
- package/dist/assert/type-string/type-string.match.d.ts.map +1 -1
- package/dist/assert/type-string/type-string.match.js +7 -1
- package/dist/assert/type-string/type-string.match.js.map +1 -1
- package/dist/assert/type-string/type-string.type.d.ts +30 -0
- package/dist/assert/type-string/type-string.type.d.ts.map +1 -0
- package/dist/assert/type-string/type-string.type.js +9 -0
- package/dist/assert/type-string/type-string.type.js.map +1 -0
- package/dist/assert/type-symbol/type-symbol.assert.d.ts +5 -0
- package/dist/assert/type-symbol/type-symbol.assert.d.ts.map +1 -0
- package/dist/assert/type-symbol/type-symbol.assert.js +13 -0
- package/dist/assert/type-symbol/type-symbol.assert.js.map +1 -0
- package/dist/assert/type-symbol/type-symbol.match.d.ts +6 -0
- package/dist/assert/type-symbol/type-symbol.match.d.ts.map +1 -0
- package/dist/assert/type-symbol/type-symbol.match.js +14 -0
- package/dist/assert/type-symbol/type-symbol.match.js.map +1 -0
- package/dist/assert/type-symbol/type-symbol.type.d.ts +30 -0
- package/dist/assert/type-symbol/type-symbol.type.d.ts.map +1 -0
- package/dist/assert/type-symbol/type-symbol.type.js +9 -0
- package/dist/assert/type-symbol/type-symbol.type.js.map +1 -0
- package/dist/assert/type-typed-array/type-typed-array.assert.d.ts +1 -1
- package/dist/assert/type-typed-array/type-typed-array.assert.d.ts.map +1 -1
- package/dist/assert/type-typed-array/type-typed-array.assert.js.map +1 -1
- package/dist/assert/type-typed-array/type-typed-array.match.d.ts +2 -6
- package/dist/assert/type-typed-array/type-typed-array.match.d.ts.map +1 -1
- package/dist/assert/type-typed-array/type-typed-array.match.js +7 -1
- package/dist/assert/type-typed-array/type-typed-array.match.js.map +1 -1
- package/dist/assert/type-typed-array/type-typed-array.type.d.ts +33 -0
- package/dist/assert/type-typed-array/type-typed-array.type.d.ts.map +1 -0
- package/dist/assert/type-typed-array/type-typed-array.type.js +8 -0
- package/dist/assert/type-typed-array/type-typed-array.type.js.map +1 -0
- package/dist/assert/uuid/uuid-v4.assert.d.ts +2 -4
- package/dist/assert/uuid/uuid-v4.assert.d.ts.map +1 -1
- package/dist/assert/uuid/uuid-v4.assert.js +2 -2
- package/dist/assert/uuid/uuid-v4.assert.js.map +1 -1
- package/dist/assert/uuid/uuid-v4.match.d.ts +2 -4
- package/dist/assert/uuid/uuid-v4.match.d.ts.map +1 -1
- package/dist/assert/uuid/uuid-v4.match.js +7 -1
- package/dist/assert/uuid/uuid-v4.match.js.map +1 -1
- package/dist/assert/uuid/uuid-v4.type.d.ts +34 -0
- package/dist/assert/uuid/uuid-v4.type.d.ts.map +1 -0
- package/dist/assert/uuid/uuid-v4.type.js +8 -0
- package/dist/assert/uuid/uuid-v4.type.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/match/match.d.ts +37 -1
- package/dist/match/match.d.ts.map +1 -1
- package/dist/match/match.js.map +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -82,6 +82,7 @@ structure.
|
|
|
82
82
|
- [assertFalse](src/assert/false/false.assert.ts)
|
|
83
83
|
- [assertIdentical](src/assert/identical/identical.assert.ts)
|
|
84
84
|
- [assertInstanceOf](src/assert/instance-of/instance-of.assert.ts)
|
|
85
|
+
- [assertMapSize](src/assert/map-size/map-size.assert.ts)
|
|
85
86
|
- [assertNonNullable](src/assert/non-nullable/non-nullable.assert.ts)
|
|
86
87
|
- [assertNumberBetween](src/assert/number-between/number-between.assert.ts)
|
|
87
88
|
- [assertNumberToNearest](src/assert/number-to-nearest/number-to-nearest.assert.ts)
|
|
@@ -122,6 +123,7 @@ structure.
|
|
|
122
123
|
- [nonEmptyArray](src/assert/array-not-empty/array-not-empty.match.ts)
|
|
123
124
|
- [bufferEqualTo](src/assert/buffer-equal/buffer-equal.match.ts)
|
|
124
125
|
- [instanceOf](src/assert/instance-of/instance-of.match.ts)
|
|
126
|
+
- [mapOfSize](src/assert/map-size/map-size.match.ts)
|
|
125
127
|
- [nonNullable](src/assert/non-nullable/non-nullable.match.ts)
|
|
126
128
|
- [numberBetween](src/assert/number-between/number-between.match.ts)
|
|
127
129
|
- [numberToNearest](src/assert/number-to-nearest/number-to-nearest.match.ts)
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Note that this is an identity match, so objects in an array only fulfill the
|
|
5
|
-
* assertion by being a reference to the same object, rather than equivalent in
|
|
6
|
-
* value to another object reference.
|
|
7
|
-
*/
|
|
8
|
-
export declare function assertArrayIncludes<T, const E extends T>(value: readonly T[], element: E, message?: string): asserts value is ArrayIncluding<T, E>;
|
|
1
|
+
import type { ArrayIncluding } from "./array-includes.type.js";
|
|
2
|
+
export declare function assertArrayIncludes<TArray extends unknown[], const E extends TArray[number]>(value: TArray, element: E, message?: string): asserts value is TArray & ArrayIncluding<TArray[number]>;
|
|
3
|
+
export declare function assertArrayIncludes<const E>(value: unknown, element: E, message?: string): asserts value is ArrayIncluding<E>;
|
|
9
4
|
//# sourceMappingURL=array-includes.assert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-includes.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.assert.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array-includes.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.assert.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,wBAAgB,mBAAmB,CACjC,MAAM,SAAS,OAAO,EAAE,EACxB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,EAE9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5D,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,CAAC,EACzC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,CAAC,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-includes.assert.js","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"array-includes.assert.js","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAkBlD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAc,EACd,OAAgB,EAChB,OAAgB;IAEhB,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,cAAc,CACtB,OAAO;YACL,YAAY,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,mBAAmB,EACxE,KAAK,EACL,OAAO,CAAC,SAAS,EAAE,CACpB,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
export type ArrayIncluding<T, E extends T> = Omit<readonly [T, ...T[]], "includes"> & {
|
|
3
|
-
includes(searchElement: E, fromIndex?: number): true;
|
|
4
|
-
includes(searchElement: T, fromIndex?: number): boolean;
|
|
5
|
-
};
|
|
6
|
-
export type ArrayIncludingMatcher<E> = AssertionMatcher<ArrayIncluding<unknown, E>>;
|
|
1
|
+
import { type ArrayIncludingMatcher } from "./array-includes.type.js";
|
|
7
2
|
/**
|
|
8
3
|
* Matcher for an array including a specific single element.
|
|
9
4
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-includes.match.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.match.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array-includes.match.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.match.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAY5E"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { createMatcher } from "../../match/match.js";
|
|
2
2
|
import { desc, repr } from "../../describe/describe.js";
|
|
3
|
+
import { arrayIncludingMatcher, } from "./array-includes.type.js";
|
|
3
4
|
/**
|
|
4
5
|
* Matcher for an array including a specific single element.
|
|
5
6
|
*/
|
|
6
7
|
export function arrayIncluding(element) {
|
|
7
|
-
return
|
|
8
|
+
return {
|
|
9
|
+
...createMatcher((value) => Array.isArray(value) && value.includes(element), () => `array including ${desc(element)}`, () => `[…,${repr(element)},…]`),
|
|
10
|
+
// Runtime marker used only to make the matcher type nominal for type-level
|
|
11
|
+
// refinement dispatch. It is not part of the user-facing matcher behaviour.
|
|
12
|
+
[arrayIncludingMatcher]: element,
|
|
13
|
+
};
|
|
8
14
|
}
|
|
9
15
|
//# sourceMappingURL=array-includes.match.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-includes.match.js","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.match.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"array-includes.match.js","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.match.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EACL,qBAAqB,GAGtB,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,cAAc,CAAU,OAAU;IAChD,OAAO;QACL,GAAG,aAAa,CACd,CAAC,KAAK,EAA8B,EAAE,CACpC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EACjD,GAAG,EAAE,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,EAAE,EACxC,GAAG,EAAE,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAC/B;QACD,2EAA2E;QAC3E,4EAA4E;QAC5E,CAAC,qBAAqB,CAAC,EAAE,OAAO;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { AssertionMatcher, refinement } from "../../match/match.js";
|
|
2
|
+
/**
|
|
3
|
+
* Unique symbol to reliably identify the ArrayIncludingMatcher type.
|
|
4
|
+
*
|
|
5
|
+
* TypeScript is structurally typed, so matcher types with similar predicates
|
|
6
|
+
* can otherwise accidentally satisfy each other's conditional branches.
|
|
7
|
+
*/
|
|
8
|
+
export declare const arrayIncludingMatcher: unique symbol;
|
|
9
|
+
type ArrayElement<T> = T extends readonly (infer TElement)[] ? TElement : unknown;
|
|
10
|
+
type MatchingArrayElement<TActualElement, TElement> = [
|
|
11
|
+
Extract<TActualElement, TElement>
|
|
12
|
+
] extends [never] ? TElement : Extract<TActualElement, TElement>;
|
|
13
|
+
export type ArrayIncluding<T> = [T, ...unknown[]];
|
|
14
|
+
/**
|
|
15
|
+
* Type produced when an actual value is matched by arrayIncluding().
|
|
16
|
+
*
|
|
17
|
+
* The leading tuple element is a type-level witness that the array includes the
|
|
18
|
+
* required value. It does not claim the value is at runtime index 0. This is a
|
|
19
|
+
* deliberate tradeoff: TypeScript cannot cleanly express "appears somewhere in
|
|
20
|
+
* the array", and this witness shape keeps user-facing types readable.
|
|
21
|
+
*
|
|
22
|
+
* When the calling scope already knows the actual value is an array, we
|
|
23
|
+
* preserve its element type for the rest of the tuple. Otherwise, the rest is
|
|
24
|
+
* unknown[].
|
|
25
|
+
*/
|
|
26
|
+
export type ArrayIncludingMatch<TActual, TElement> = [
|
|
27
|
+
Extract<NonNullable<TActual>, readonly unknown[]>
|
|
28
|
+
] extends [never] ? [TElement, ...unknown[]] : [
|
|
29
|
+
MatchingArrayElement<ArrayElement<Extract<NonNullable<TActual>, readonly unknown[]>>, TElement>,
|
|
30
|
+
...ArrayElement<Extract<NonNullable<TActual>, readonly unknown[]>>[]
|
|
31
|
+
];
|
|
32
|
+
export type ArrayIncludingMatcher<T = unknown> = AssertionMatcher<ArrayIncluding<T>> & {
|
|
33
|
+
readonly [arrayIncludingMatcher]: T;
|
|
34
|
+
/**
|
|
35
|
+
* Optional type-level hook used by compositional assertions such as
|
|
36
|
+
* assertObjectMatches().
|
|
37
|
+
*
|
|
38
|
+
* This lets the matcher describe how it refines an existing actual type,
|
|
39
|
+
* rather than only exposing the standalone matches() predicate type.
|
|
40
|
+
*/
|
|
41
|
+
readonly [refinement]?: <TActual>(actual: TActual) => ArrayIncludingMatch<TActual, T>;
|
|
42
|
+
};
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=array-includes.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-includes.type.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,eAA2C,CAAC;AAE9E,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,QAAQ,CAAC,EAAE,GACxD,QAAQ,GACR,OAAO,CAAC;AAEZ,KAAK,oBAAoB,CAAC,cAAc,EAAE,QAAQ,IAAI;IACpD,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC;CAClC,SAAS,CAAC,KAAK,CAAC,GACb,QAAQ,GACR,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAEtC,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAElD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,mBAAmB,CAAC,OAAO,EAAE,QAAQ,IAAI;IACnD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CAClD,SAAS,CAAC,KAAK,CAAC,GACb,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,GACxB;IACE,oBAAoB,CAClB,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,EAC/D,QAAQ,CACT;IACD,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,EAAE;CACrE,CAAC;AAEN,MAAM,MAAM,qBAAqB,CAAC,CAAC,GAAG,OAAO,IAAI,gBAAgB,CAC/D,cAAc,CAAC,CAAC,CAAC,CAClB,GAAG;IACF,QAAQ,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAEpC;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,EAC9B,MAAM,EAAE,OAAO,KACZ,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;CACtC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unique symbol to reliably identify the ArrayIncludingMatcher type.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript is structurally typed, so matcher types with similar predicates
|
|
5
|
+
* can otherwise accidentally satisfy each other's conditional branches.
|
|
6
|
+
*/
|
|
7
|
+
export const arrayIncludingMatcher = Symbol("smartass.arrayIncludingMatcher");
|
|
8
|
+
//# sourceMappingURL=array-includes.type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-includes.type.js","sourceRoot":"","sources":["../../../src/assert/array-includes/array-includes.type.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,gCAAgC,CAAC,CAAC"}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Elements can appear in any order and do not need to be contiguous.
|
|
5
|
-
* Each required element must be present at least once.
|
|
6
|
-
*/
|
|
7
|
-
export declare function assertArrayIncludesAll<T, const E extends readonly T[]>(value: readonly T[], elements: E, message?: string): asserts value is ArrayIncludingAll<T, E>;
|
|
1
|
+
import type { ArrayElement, ArrayIncludingAll, ArrayIncludingAllElement } from "./array-includes-all.type.js";
|
|
2
|
+
export declare function assertArrayIncludesAll<TArray extends unknown[], const E extends readonly ArrayElement<TArray>[]>(value: TArray, elements: E, message?: string): asserts value is TArray & ArrayIncludingAll<ArrayElement<TArray>, E["length"]>;
|
|
3
|
+
export declare function assertArrayIncludesAll<const E extends readonly unknown[]>(value: unknown, elements: E, message?: string): asserts value is ArrayIncludingAll<ArrayIncludingAllElement<E>, E["length"]>;
|
|
8
4
|
//# sourceMappingURL=array-includes-all.assert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-includes-all.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.assert.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array-includes-all.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.assert.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,8BAA8B,CAAC;AAEtC,wBAAgB,sBAAsB,CACpC,MAAM,SAAS,OAAO,EAAE,EACxB,KAAK,CAAC,CAAC,SAAS,SAAS,YAAY,CAAC,MAAM,CAAC,EAAE,EAE/C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,MAAM,GACxB,iBAAiB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEvD,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,EACvE,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC"}
|
|
@@ -1,17 +1,39 @@
|
|
|
1
|
-
import { arrayIncludingAll
|
|
1
|
+
import { arrayIncludingAll } from "./array-includes-all.match.js";
|
|
2
2
|
import { AssertionError } from "../../assertion-error.js";
|
|
3
3
|
import { desc, repr } from "../../describe/describe.js";
|
|
4
4
|
/**
|
|
5
5
|
* Assert that an array includes all specified elements, with type narrowing.
|
|
6
6
|
* Elements can appear in any order and do not need to be contiguous.
|
|
7
|
-
*
|
|
7
|
+
* Repeated required elements must appear at least that many times.
|
|
8
8
|
*/
|
|
9
9
|
export function assertArrayIncludesAll(value, elements, message) {
|
|
10
10
|
const matcher = arrayIncludingAll(elements);
|
|
11
11
|
if (!matcher.matches(value)) {
|
|
12
|
-
|
|
13
|
-
throw new AssertionError(message ??
|
|
14
|
-
`Expected ${desc(value)} to include all of ${repr(elements)}, but missing ${repr(missing)}.`, value, matcher.represent());
|
|
12
|
+
throw new AssertionError(message ?? buildArrayIncludesAllMessage(value, elements), value, matcher.represent());
|
|
15
13
|
}
|
|
16
14
|
}
|
|
15
|
+
function buildArrayIncludesAllMessage(value, elements) {
|
|
16
|
+
if (!Array.isArray(value)) {
|
|
17
|
+
return `Expected ${desc(value)} to be array including all of ${desc(elements)}.`;
|
|
18
|
+
}
|
|
19
|
+
const missing = findMissingElements(value, elements);
|
|
20
|
+
return `Expected ${desc(value)} to include all of ${repr(elements)}, but missing ${repr(missing)}.`;
|
|
21
|
+
}
|
|
22
|
+
function findMissingElements(value, elements) {
|
|
23
|
+
const remaining = [...value];
|
|
24
|
+
const missing = [];
|
|
25
|
+
for (const element of elements) {
|
|
26
|
+
const index = remaining.findIndex((candidate) => sameValueZero(candidate, element));
|
|
27
|
+
if (index === -1) {
|
|
28
|
+
missing.push(element);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
remaining.splice(index, 1);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return missing;
|
|
35
|
+
}
|
|
36
|
+
function sameValueZero(left, right) {
|
|
37
|
+
return left === right || (Number.isNaN(left) && Number.isNaN(right));
|
|
38
|
+
}
|
|
17
39
|
//# sourceMappingURL=array-includes-all.assert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-includes-all.assert.js","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.assert.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"array-includes-all.assert.js","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAuBxD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAc,EACd,QAA4B,EAC5B,OAAgB;IAEhB,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,cAAc,CACtB,OAAO,IAAI,4BAA4B,CAAC,KAAK,EAAE,QAAQ,CAAC,EACxD,KAAK,EACL,OAAO,CAAC,SAAS,EAAE,CACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CACnC,KAAc,EACd,QAA4B;IAE5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,IAAI,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IACnF,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAErD,OAAO,YAAY,IAAI,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AACtG,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAyB,EACzB,QAA4B;IAE5B,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAc,EAAE,CAAC;IAE9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAC9C,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAClC,CAAC;QAEF,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,IAAa,EAAE,KAAc;IAClD,OAAO,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export type ArrayIncludingAll<T, E extends readonly T[]> = Omit<readonly [T, ...T[]], "includes"> & {
|
|
3
|
-
includes(searchElement: E[number], fromIndex?: number): true;
|
|
4
|
-
includes(searchElement: T, fromIndex?: number): boolean;
|
|
5
|
-
};
|
|
6
|
-
export type ArrayIncludingAllMatcher<E extends readonly unknown[]> = AssertionMatcher<ArrayIncludingAll<unknown, E>>;
|
|
1
|
+
import type { ArrayIncludingAllElement, ArrayIncludingAllMatcher } from "./array-includes-all.type.js";
|
|
7
2
|
/**
|
|
8
3
|
* Matcher for an array including all specified elements.
|
|
9
4
|
* Elements can appear in any order and do not need to be contiguous.
|
|
10
|
-
*
|
|
5
|
+
* Repeated required elements must appear at least that many times.
|
|
11
6
|
*/
|
|
12
|
-
export declare function arrayIncludingAll<const E extends readonly unknown[]>(elements: E): ArrayIncludingAllMatcher<E>;
|
|
7
|
+
export declare function arrayIncludingAll<const E extends readonly unknown[]>(elements: E): ArrayIncludingAllMatcher<ArrayIncludingAllElement<E>, E["length"]>;
|
|
13
8
|
//# sourceMappingURL=array-includes-all.match.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-includes-all.match.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.match.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array-includes-all.match.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.match.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,8BAA8B,CAAC;AAEtC;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,EAClE,QAAQ,EAAE,CAAC,GACV,wBAAwB,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CASpE"}
|
|
@@ -3,11 +3,24 @@ import { desc, repr } from "../../describe/describe.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* Matcher for an array including all specified elements.
|
|
5
5
|
* Elements can appear in any order and do not need to be contiguous.
|
|
6
|
-
*
|
|
6
|
+
* Repeated required elements must appear at least that many times.
|
|
7
7
|
*/
|
|
8
8
|
export function arrayIncludingAll(elements) {
|
|
9
|
-
return createMatcher((value) => Array.isArray(value) &&
|
|
10
|
-
|
|
9
|
+
return createMatcher((value) => Array.isArray(value) && includesAll(value, elements), () => `array including all of ${desc(elements)}`, () => `[…,${reprArrayElements(elements)},…]`);
|
|
10
|
+
}
|
|
11
|
+
function includesAll(value, elements) {
|
|
12
|
+
const remaining = [...value];
|
|
13
|
+
return elements.every((element) => {
|
|
14
|
+
const index = remaining.findIndex((candidate) => sameValueZero(candidate, element));
|
|
15
|
+
if (index === -1) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
remaining.splice(index, 1);
|
|
19
|
+
return true;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function sameValueZero(left, right) {
|
|
23
|
+
return left === right || (Number.isNaN(left) && Number.isNaN(right));
|
|
11
24
|
}
|
|
12
25
|
function reprArrayElements(values) {
|
|
13
26
|
if (values.length <= 5) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-includes-all.match.js","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.match.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"array-includes-all.match.js","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.match.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAOxD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAW;IAEX,OAAO,aAAa,CAClB,CACE,KAAK,EACiE,EAAE,CACxE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EACtD,GAAG,EAAE,CAAC,0BAA0B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAChD,GAAG,EAAE,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAC7C,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,KAAyB,EACzB,QAA4B;IAE5B,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAE7B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAC9C,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAClC,CAAC;QAEF,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,IAAa,EAAE,KAAc;IAClD,OAAO,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,iBAAiB,CAAC,MAA0B;IACnD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AssertionMatcher, refinement } from "../../match/match.js";
|
|
2
|
+
export type ArrayIncludingAllElement<E extends readonly unknown[]> = E[number] extends never ? unknown : E[number];
|
|
3
|
+
export type ArrayElement<TArray extends readonly unknown[]> = TArray[number];
|
|
4
|
+
type ArrayElementOf<T> = T extends readonly (infer TElement)[] ? TElement : unknown;
|
|
5
|
+
type MatchingArrayElement<TActualElement, TElement> = [
|
|
6
|
+
Extract<TActualElement, TElement>
|
|
7
|
+
] extends [never] ? TElement : Extract<TActualElement, TElement>;
|
|
8
|
+
type ArrayIncludingAllWitness<TElement, N extends number, TRestElement> = N extends 0 ? TRestElement[] : N extends 1 ? [TElement, ...TRestElement[]] : N extends 2 ? [TElement, TElement, ...TRestElement[]] : N extends 3 ? [TElement, TElement, TElement, ...TRestElement[]] : N extends 4 ? [TElement, TElement, TElement, TElement, ...TRestElement[]] : N extends 5 ? [
|
|
9
|
+
TElement,
|
|
10
|
+
TElement,
|
|
11
|
+
TElement,
|
|
12
|
+
TElement,
|
|
13
|
+
TElement,
|
|
14
|
+
...TRestElement[]
|
|
15
|
+
] : [
|
|
16
|
+
TElement,
|
|
17
|
+
TElement,
|
|
18
|
+
TElement,
|
|
19
|
+
TElement,
|
|
20
|
+
TElement,
|
|
21
|
+
...TRestElement[]
|
|
22
|
+
];
|
|
23
|
+
export type ArrayIncludingAll<T, N extends number> = N extends 0 ? T[] : N extends 1 ? [T, ...T[]] : N extends 2 ? [T, T, ...T[]] : N extends 3 ? [T, T, T, ...T[]] : N extends 4 ? [T, T, T, T, ...T[]] : N extends 5 ? [T, T, T, T, T, ...T[]] : [T, T, T, T, T, ...T[]];
|
|
24
|
+
/**
|
|
25
|
+
* Type produced when an actual value is matched by arrayIncludingAll().
|
|
26
|
+
*
|
|
27
|
+
* The leading tuple elements are type-level witnesses that the array includes
|
|
28
|
+
* the required number of matching values. They do not claim those values are at
|
|
29
|
+
* those runtime indexes. This keeps user-facing types readable while still
|
|
30
|
+
* communicating the useful facts: the array has enough elements, and those
|
|
31
|
+
* witness elements match the requested element type.
|
|
32
|
+
*
|
|
33
|
+
* When the calling scope already knows the actual value is an array, we
|
|
34
|
+
* preserve its element type for the rest of the tuple. Otherwise, the rest is
|
|
35
|
+
* unknown[].
|
|
36
|
+
*/
|
|
37
|
+
export type ArrayIncludingAllMatch<TActual, TElement, N extends number> = [
|
|
38
|
+
Extract<NonNullable<TActual>, readonly unknown[]>
|
|
39
|
+
] extends [never] ? ArrayIncludingAllWitness<TElement, N, unknown> : ArrayIncludingAllWitness<MatchingArrayElement<ArrayElementOf<Extract<NonNullable<TActual>, readonly unknown[]>>, TElement>, N, ArrayElementOf<Extract<NonNullable<TActual>, readonly unknown[]>>>;
|
|
40
|
+
export type ArrayIncludingAllMatcher<T = unknown, N extends number = number> = AssertionMatcher<ArrayIncludingAll<T, N>> & {
|
|
41
|
+
/**
|
|
42
|
+
* Optional type-level hook used by compositional assertions such as
|
|
43
|
+
* assertObjectMatches().
|
|
44
|
+
*
|
|
45
|
+
* This lets the matcher describe how it refines an existing actual type,
|
|
46
|
+
* rather than only exposing the standalone matches() predicate type.
|
|
47
|
+
*/
|
|
48
|
+
readonly [refinement]?: <TActual>(actual: TActual) => ArrayIncludingAllMatch<TActual, T, N>;
|
|
49
|
+
};
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=array-includes-all.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-includes-all.type.d.ts","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEzE,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IAC/D,CAAC,CAAC,MAAM,CAAC,SAAS,KAAK,GAAG,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,YAAY,CAAC,MAAM,SAAS,SAAS,OAAO,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;AAE7E,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,QAAQ,CAAC,EAAE,GAC1D,QAAQ,GACR,OAAO,CAAC;AAEZ,KAAK,oBAAoB,CAAC,cAAc,EAAE,QAAQ,IAAI;IACpD,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC;CAClC,SAAS,CAAC,KAAK,CAAC,GACb,QAAQ,GACR,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAEtC,KAAK,wBAAwB,CAC3B,QAAQ,EACR,CAAC,SAAS,MAAM,EAChB,YAAY,IACV,CAAC,SAAS,CAAC,GACX,YAAY,EAAE,GACd,CAAC,SAAS,CAAC,GACT,CAAC,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAC,GAC7B,CAAC,SAAS,CAAC,GACT,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAC,GACvC,CAAC,SAAS,CAAC,GACT,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAC,GACjD,CAAC,SAAS,CAAC,GACT,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAC,GAC3D,CAAC,SAAS,CAAC,GACT;IACE,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,GAAG,YAAY,EAAE;CAClB,GACD;IACE,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,GAAG,YAAY,EAAE;CAClB,CAAC;AAEhB,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,GAC5D,CAAC,EAAE,GACH,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GACX,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GACd,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GACjB,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GACpB,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GACvB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAEtC;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,SAAS,MAAM,IAAI;IACxE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CAClD,SAAS,CAAC,KAAK,CAAC,GACb,wBAAwB,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,GAC9C,wBAAwB,CACtB,oBAAoB,CAClB,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,EACjE,QAAQ,CACT,EACD,CAAC,EACD,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,CAClE,CAAC;AAEN,MAAM,MAAM,wBAAwB,CAClC,CAAC,GAAG,OAAO,EACX,CAAC,SAAS,MAAM,GAAG,MAAM,IACvB,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;IAC9C;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,EAC9B,MAAM,EAAE,OAAO,KACZ,sBAAsB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-includes-all.type.js","sourceRoot":"","sources":["../../../src/assert/array-includes-all/array-includes-all.type.ts"],"names":[],"mappings":""}
|
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* The type narrowing indicates:
|
|
5
|
-
* - An empty array for 0
|
|
6
|
-
* - An exact number of elements up to 10
|
|
7
|
-
* - At least 10 elements for >10
|
|
8
|
-
*/
|
|
9
|
-
export declare function assertArrayLength<T, const N extends number>(value: readonly T[] | undefined | null, expectedLength: N, message?: string): asserts value is ArrayOfLength<T, N>;
|
|
1
|
+
import type { ArrayOfLength } from "./array-length.type.js";
|
|
2
|
+
export declare function assertArrayLength<TArray extends unknown[], const N extends number>(value: TArray, expectedLength: N, message?: string): asserts value is TArray & ArrayOfLength<TArray[number], N>;
|
|
3
|
+
export declare function assertArrayLength<const N extends number>(value: unknown, expectedLength: N, message?: string): asserts value is ArrayOfLength<unknown, N>;
|
|
10
4
|
//# sourceMappingURL=array-length.assert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-length.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.assert.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array-length.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.assert.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,wBAAgB,iBAAiB,CAC/B,MAAM,SAAS,OAAO,EAAE,EACxB,KAAK,CAAC,CAAC,SAAS,MAAM,EAEtB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,CAAC,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAE9D,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EACtD,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,CAAC,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { arrayOfLength } from "./array-length.match.js";
|
|
2
|
-
import { assertNonNullable } from "../non-nullable/non-nullable.assert.js";
|
|
3
2
|
import { AssertionError } from "../../assertion-error.js";
|
|
4
3
|
import { desc, repr } from "../../describe/describe.js";
|
|
5
4
|
/**
|
|
@@ -10,11 +9,15 @@ import { desc, repr } from "../../describe/describe.js";
|
|
|
10
9
|
* - At least 10 elements for >10
|
|
11
10
|
*/
|
|
12
11
|
export function assertArrayLength(value, expectedLength, message) {
|
|
13
|
-
assertNonNullable(value, message);
|
|
14
12
|
const matcher = arrayOfLength(expectedLength);
|
|
15
13
|
if (!matcher.matches(value)) {
|
|
16
|
-
throw new AssertionError(message ??
|
|
17
|
-
`Expected ${desc(value)} to have length ${repr(expectedLength)}, but it had length ${repr(value.length)}.`, value, matcher.represent());
|
|
14
|
+
throw new AssertionError(message ?? buildArrayLengthMessage(value, expectedLength), value, matcher.represent());
|
|
18
15
|
}
|
|
19
16
|
}
|
|
17
|
+
function buildArrayLengthMessage(value, expectedLength) {
|
|
18
|
+
if (!Array.isArray(value)) {
|
|
19
|
+
return `Expected ${desc(value)} to be an array of length ${repr(expectedLength)}.`;
|
|
20
|
+
}
|
|
21
|
+
return `Expected ${desc(value)} to have length ${repr(expectedLength)}, but it had length ${repr(value.length)}.`;
|
|
22
|
+
}
|
|
20
23
|
//# sourceMappingURL=array-length.assert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-length.assert.js","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"array-length.assert.js","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAkBxD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,cAAsB,EACtB,OAAgB;IAEhB,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,cAAc,CACtB,OAAO,IAAI,uBAAuB,CAAC,KAAK,EAAE,cAAc,CAAC,EACzD,KAAK,EACL,OAAO,CAAC,SAAS,EAAE,CACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAAc,EACd,cAAsB;IAEtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,IAAI,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;IACrF,CAAC;IAED,OAAO,YAAY,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,cAAc,CAAC,uBAAuB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AACpH,CAAC"}
|
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
export type ArrayOfLength<T, N extends number> = N extends 0 ? readonly [] : N extends 1 ? readonly [T] : N extends 2 ? readonly [T, T] : N extends 3 ? readonly [T, T, T] : N extends 4 ? readonly [T, T, T, T] : N extends 5 ? readonly [T, T, T, T, T] : N extends 6 ? readonly [T, T, T, T, T, T] : N extends 7 ? readonly [T, T, T, T, T, T, T] : N extends 8 ? readonly [T, T, T, T, T, T, T, T] : N extends 9 ? readonly [T, T, T, T, T, T, T, T, T] : N extends 10 ? readonly [T, T, T, T, T, T, T, T, T, T] : readonly [T, T, T, T, T, T, T, T, T, T, ...T[]] & {
|
|
3
|
-
length: N;
|
|
4
|
-
};
|
|
5
|
-
type ArrayElement<T> = T extends readonly (infer E)[] ? E : unknown;
|
|
6
|
-
export type ArrayOfLengthMatcher<N extends number> = AssertionMatcher<ArrayOfLength<unknown, N>> & {
|
|
7
|
-
readonly [refinement]?: <TActual>(actual: TActual) => NonNullable<TActual> extends readonly unknown[] ? ArrayOfLength<ArrayElement<NonNullable<TActual>>, N> : ArrayOfLength<unknown, N>;
|
|
8
|
-
};
|
|
1
|
+
import { type ArrayOfLengthMatcher } from "./array-length.type.js";
|
|
9
2
|
/**
|
|
10
3
|
* Matcher for an array with exactly the expected length.
|
|
11
4
|
*/
|
|
12
5
|
export declare function arrayOfLength<const N extends number>(expectedLength: N): ArrayOfLengthMatcher<N>;
|
|
13
|
-
export {};
|
|
14
6
|
//# sourceMappingURL=array-length.match.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-length.match.d.ts","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.match.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array-length.match.d.ts","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.match.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EAClD,cAAc,EAAE,CAAC,GAChB,oBAAoB,CAAC,CAAC,CAAC,CAYzB"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import { createMatcher
|
|
1
|
+
import { createMatcher } from "../../match/match.js";
|
|
2
2
|
import { repr } from "../../describe/describe.js";
|
|
3
|
+
import { arrayOfLengthMatcher, } from "./array-length.type.js";
|
|
3
4
|
/**
|
|
4
5
|
* Matcher for an array with exactly the expected length.
|
|
5
6
|
*/
|
|
6
7
|
export function arrayOfLength(expectedLength) {
|
|
7
|
-
return
|
|
8
|
+
return {
|
|
9
|
+
...createMatcher((value) => Array.isArray(value) && value.length === expectedLength, () => `array of length ${repr(expectedLength)}`, () => `Array(${repr(expectedLength)})`),
|
|
10
|
+
// Runtime marker used only to make the matcher type nominal for type-level
|
|
11
|
+
// refinement dispatch. It is not part of the user-facing matcher behaviour.
|
|
12
|
+
[arrayOfLengthMatcher]: expectedLength,
|
|
13
|
+
};
|
|
8
14
|
}
|
|
9
15
|
//# sourceMappingURL=array-length.match.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-length.match.js","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.match.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"array-length.match.js","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.match.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAClD,OAAO,EACL,oBAAoB,GAGrB,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,cAAiB;IAEjB,OAAO;QACL,GAAG,aAAa,CACd,CAAC,KAAK,EAAsC,EAAE,CAC5C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EACzD,GAAG,EAAE,CAAC,mBAAmB,IAAI,CAAC,cAAc,CAAC,EAAE,EAC/C,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC,cAAc,CAAC,GAAG,CACvC;QACD,2EAA2E;QAC3E,4EAA4E;QAC5E,CAAC,oBAAoB,CAAC,EAAE,cAAc;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AssertionMatcher, refinement } from "../../match/match.js";
|
|
2
|
+
/**
|
|
3
|
+
* Unique symbol to reliably identify the ArrayOfLengthMatcher type.
|
|
4
|
+
*
|
|
5
|
+
* TypeScript is structurally typed, so matcher types with similar predicates
|
|
6
|
+
* can otherwise accidentally satisfy each other's conditional branches.
|
|
7
|
+
*/
|
|
8
|
+
export declare const arrayOfLengthMatcher: unique symbol;
|
|
9
|
+
type ArrayElementOf<T> = T extends readonly (infer TElement)[] ? TElement : unknown;
|
|
10
|
+
type ArrayMatchElement<TActual> = [
|
|
11
|
+
Extract<NonNullable<TActual>, readonly unknown[]>
|
|
12
|
+
] extends [never] ? unknown : ArrayElementOf<Extract<NonNullable<TActual>, readonly unknown[]>>;
|
|
13
|
+
export type ArrayOfLength<T, N extends number> = N extends 0 ? [] : N extends 1 ? [T] : N extends 2 ? [T, T] : N extends 3 ? [T, T, T] : N extends 4 ? [T, T, T, T] : N extends 5 ? [T, T, T, T, T] : N extends 6 ? [T, T, T, T, T, T] : N extends 7 ? [T, T, T, T, T, T, T] : N extends 8 ? [T, T, T, T, T, T, T, T] : N extends 9 ? [T, T, T, T, T, T, T, T, T] : N extends 10 ? [T, T, T, T, T, T, T, T, T, T] : [T, T, T, T, T, T, T, T, T, T, ...T[]] & {
|
|
14
|
+
length: N;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Type produced when an actual value is matched by arrayOfLength().
|
|
18
|
+
*
|
|
19
|
+
* The primary goal is to expose clean, readable user-facing types in IDE
|
|
20
|
+
* tooltips and TypeScript errors. When the calling scope already knows the
|
|
21
|
+
* actual value is an array, we preserve its element type. Otherwise, we fall
|
|
22
|
+
* back to unknown elements.
|
|
23
|
+
*/
|
|
24
|
+
export type ArrayOfLengthMatch<TActual, N extends number> = ArrayOfLength<ArrayMatchElement<TActual>, N>;
|
|
25
|
+
export type ArrayOfLengthMatcher<N extends number> = AssertionMatcher<ArrayOfLength<unknown, N>> & {
|
|
26
|
+
readonly [arrayOfLengthMatcher]: N;
|
|
27
|
+
/**
|
|
28
|
+
* Optional type-level hook used by compositional assertions such as
|
|
29
|
+
* assertObjectMatches().
|
|
30
|
+
*
|
|
31
|
+
* This lets the matcher describe how it refines an existing actual type,
|
|
32
|
+
* rather than only exposing the standalone matches() predicate type.
|
|
33
|
+
*/
|
|
34
|
+
readonly [refinement]?: <TActual>(actual: TActual) => ArrayOfLengthMatch<TActual, N>;
|
|
35
|
+
};
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=array-length.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-length.type.d.ts","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,eAA0C,CAAC;AAE5E,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,QAAQ,CAAC,EAAE,GAC1D,QAAQ,GACR,OAAO,CAAC;AAEZ,KAAK,iBAAiB,CAAC,OAAO,IAAI;IAChC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CAClD,SAAS,CAAC,KAAK,CAAC,GACb,OAAO,GACP,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;AAEtE,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,GACxD,EAAE,GACF,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,CAAC,GACH,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,CAAC,GACN,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACT,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACZ,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACf,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAClB,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACrB,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACxB,CAAC,SAAS,CAAC,GACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC3B,CAAC,SAAS,EAAE,GACV,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC9B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG;IACvC,MAAM,EAAE,CAAC,CAAC;CACX,CAAC;AAE1B;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,CAAC,OAAO,EAAE,CAAC,SAAS,MAAM,IAAI,aAAa,CACvE,iBAAiB,CAAC,OAAO,CAAC,EAC1B,CAAC,CACF,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,MAAM,IAAI,gBAAgB,CACnE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAC1B,GAAG;IACF,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAEnC;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,EAC9B,MAAM,EAAE,OAAO,KACZ,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;CACrC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unique symbol to reliably identify the ArrayOfLengthMatcher type.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript is structurally typed, so matcher types with similar predicates
|
|
5
|
+
* can otherwise accidentally satisfy each other's conditional branches.
|
|
6
|
+
*/
|
|
7
|
+
export const arrayOfLengthMatcher = Symbol("smartass.arrayOfLengthMatcher");
|
|
8
|
+
//# sourceMappingURL=array-length.type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-length.type.js","sourceRoot":"","sources":["../../../src/assert/array-length/array-length.type.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAC"}
|
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* The type narrowing indicates:
|
|
5
|
-
* - A non-empty array for 1
|
|
6
|
-
* - At least N elements up to 5
|
|
7
|
-
* - At least 5 elements for >5
|
|
8
|
-
*/
|
|
9
|
-
export declare function assertArrayMinLength<T, const N extends number>(value: readonly T[] | undefined | null, minLength: N, message?: string): asserts value is ArrayOfMinLength<T, N>;
|
|
1
|
+
import type { ArrayOfMinLength } from "./array-min-length.type.js";
|
|
2
|
+
export declare function assertArrayMinLength<TArray extends unknown[], const N extends number>(value: TArray, minLength: N, message?: string): asserts value is TArray & ArrayOfMinLength<TArray[number], N>;
|
|
3
|
+
export declare function assertArrayMinLength<const N extends number>(value: unknown, minLength: N, message?: string): asserts value is ArrayOfMinLength<unknown, N>;
|
|
10
4
|
//# sourceMappingURL=array-min-length.assert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-min-length.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/array-min-length/array-min-length.assert.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array-min-length.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/array-min-length/array-min-length.assert.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,wBAAgB,oBAAoB,CAClC,MAAM,SAAS,OAAO,EAAE,EACxB,KAAK,CAAC,CAAC,SAAS,MAAM,EAEtB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,CAAC,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EACzD,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,CAAC,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { arrayOfMinLength
|
|
2
|
-
import { assertNonNullable } from "../non-nullable/non-nullable.assert.js";
|
|
1
|
+
import { arrayOfMinLength } from "./array-min-length.match.js";
|
|
3
2
|
import { AssertionError } from "../../assertion-error.js";
|
|
4
3
|
import { desc, repr } from "../../describe/describe.js";
|
|
5
4
|
/**
|
|
@@ -10,10 +9,15 @@ import { desc, repr } from "../../describe/describe.js";
|
|
|
10
9
|
* - At least 5 elements for >5
|
|
11
10
|
*/
|
|
12
11
|
export function assertArrayMinLength(value, minLength, message) {
|
|
13
|
-
|
|
14
|
-
if (!
|
|
15
|
-
throw new AssertionError(message ??
|
|
16
|
-
`Expected ${desc(value)} to have at least ${repr(minLength)} elements, but it had ${repr(value.length)}.`, value, { minLength });
|
|
12
|
+
const matcher = arrayOfMinLength(minLength);
|
|
13
|
+
if (!matcher.matches(value)) {
|
|
14
|
+
throw new AssertionError(message ?? buildArrayMinLengthMessage(value, minLength), value, matcher.represent());
|
|
17
15
|
}
|
|
18
16
|
}
|
|
17
|
+
function buildArrayMinLengthMessage(value, minLength) {
|
|
18
|
+
if (!Array.isArray(value)) {
|
|
19
|
+
return `Expected ${desc(value)} to be an array of at least ${repr(minLength)} elements.`;
|
|
20
|
+
}
|
|
21
|
+
return `Expected ${desc(value)} to have at least ${repr(minLength)} elements, but it had ${repr(value.length)}.`;
|
|
22
|
+
}
|
|
19
23
|
//# sourceMappingURL=array-min-length.assert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-min-length.assert.js","sourceRoot":"","sources":["../../../src/assert/array-min-length/array-min-length.assert.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"array-min-length.assert.js","sourceRoot":"","sources":["../../../src/assert/array-min-length/array-min-length.assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAkBxD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAc,EACd,SAAiB,EACjB,OAAgB;IAEhB,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,cAAc,CACtB,OAAO,IAAI,0BAA0B,CAAC,KAAK,EAAE,SAAS,CAAC,EACvD,KAAK,EACL,OAAO,CAAC,SAAS,EAAE,CACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc,EAAE,SAAiB;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,IAAI,CAAC,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;IAC3F,CAAC;IAED,OAAO,YAAY,IAAI,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,yBAAyB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AACnH,CAAC"}
|