ts-data-forge 7.0.1 → 7.1.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.
@@ -1,4 +1,4 @@
1
- import { type ArrayAtLeastLen, type ArrayOfLength, type BoolOr, type NonEmptyArray, type TypeEq } from 'ts-type-forge';
1
+ import { type ArrayAtLeastLen, type ArrayAtMostLen, type ArrayBoundedLen, type ArrayOfLength, type BoolOr, type NonEmptyArray, type TypeEq } from 'ts-type-forge';
2
2
  import { type ArrayIndex, type SizeType } from '../../types.mjs';
3
3
  /**
4
4
  * Type guard that checks if a value is an array.
@@ -102,6 +102,46 @@ export declare const isArrayOfLength: <E, N extends SizeType.ArgArr>(array: read
102
102
  * ```
103
103
  */
104
104
  export declare const isArrayAtLeastLength: <E, N extends SizeType.ArgArr>(array: readonly E[], len: N) => array is ArrayAtLeastLen<N, E>;
105
+ /**
106
+ * Checks if an array has at most a specific length.
107
+ *
108
+ * @example
109
+ *
110
+ * ```ts
111
+ * const pair: readonly number[] = [1, 2] as const;
112
+ *
113
+ * const triple: readonly number[] = [1, 2, 3] as const;
114
+ *
115
+ * assert.isTrue(Arr.isArrayAtMostLength(pair, 2));
116
+ *
117
+ * assert.isFalse(Arr.isArrayAtMostLength(triple, 2));
118
+ *
119
+ * if (Arr.isArrayAtMostLength(pair, 2)) {
120
+ * assert.isTrue(pair.length <= 2);
121
+ * }
122
+ * ```
123
+ */
124
+ export declare const isArrayAtMostLength: <E, N extends SizeType.ArgArr>(array: readonly E[], len: N) => array is ArrayAtMostLen<N, E>;
125
+ /**
126
+ * Checks if an array's length is within a specific inclusive range.
127
+ *
128
+ * @example
129
+ *
130
+ * ```ts
131
+ * const pair: readonly number[] = [1, 2] as const;
132
+ *
133
+ * const quad: readonly number[] = [1, 2, 3, 4] as const;
134
+ *
135
+ * assert.isTrue(Arr.isArrayBoundedLength(pair, 1, 3));
136
+ *
137
+ * assert.isFalse(Arr.isArrayBoundedLength(quad, 1, 3));
138
+ *
139
+ * if (Arr.isArrayBoundedLength(pair, 1, 3)) {
140
+ * assert.isTrue(pair.length >= 1 && pair.length <= 3);
141
+ * }
142
+ * ```
143
+ */
144
+ export declare const isArrayBoundedLength: <E, Min extends SizeType.ArgArr, Max extends SizeType.ArgArr>(array: readonly E[], min: Min, max: Max) => array is ArrayBoundedLen<Min, Max, E>;
105
145
  /**
106
146
  * Tests whether all elements in an array pass a test implemented by a predicate.
107
147
  *
@@ -1 +1 @@
1
- {"version":3,"file":"array-utils-validation.d.mts","sourceRoot":"","sources":["../../../src/array/impl/array-utils-validation.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"array-utils-validation.d.mts","sourceRoot":"","sources":["../../../src/array/impl/array-utils-validation.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEjE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,EAAG,OAAO,CAAC,KAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CACvC,CAAC;AAEvB,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAE7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,GACrD,IAAI,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,CAAC,GAC3B,CAAC,SAAS,SAAS,OAAO,EAAE,GAC1B,CAAC,GACD,KAAK,GACT,KAAK,CAAC;AAEV,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAI1C;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,EAAG,OAAO,SAAS,CAAC,EAAE,KAAG,KAAK,IAAI,SAAS,EAChD,CAAC;AAErB;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAC1B,OAAO,SAAS,CAAC,EAAE,KAClB,KAAK,IAAI,aAAa,CAAC,CAAC,CAAqB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,CAAC,SAAS,QAAQ,CAAC,MAAM,EAC1D,OAAO,SAAS,CAAC,EAAE,EACnB,KAAK,CAAC,KACL,KAAK,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAyB,CAAC;AAExD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,SAAS,QAAQ,CAAC,MAAM,EAC/D,OAAO,SAAS,CAAC,EAAE,EACnB,KAAK,CAAC,KACL,KAAK,IAAI,eAAe,CAAC,CAAC,EAAE,CAAC,CAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAE,CAAC,SAAS,QAAQ,CAAC,MAAM,EAC9D,OAAO,SAAS,CAAC,EAAE,EACnB,KAAK,CAAC,KACL,KAAK,IAAI,cAAc,CAAC,CAAC,EAAE,CAAC,CAAwB,CAAC;AAExD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,GAC/B,CAAC,EACD,GAAG,SAAS,QAAQ,CAAC,MAAM,EAC3B,GAAG,SAAS,QAAQ,CAAC,MAAM,EAE3B,OAAO,SAAS,CAAC,EAAE,EACnB,KAAK,GAAG,EACR,KAAK,GAAG,KACP,KAAK,IAAI,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CACK,CAAC;AAE7C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAClC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAC/C,KAAK,IAAI,SAAS,CAAC,EAAE,CAAC;AAEzB,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAClC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAC/C,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,KAAK,IAAI,SAAS,CAAC,EAAE,CAAC;AAGlD,wBAAgB,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EACvD,KAAK,EAAE,EAAE,EACT,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,OAAO,GAC3D,OAAO,CAAC;AAEX,wBAAgB,KAAK,CAAC,CAAC,EACrB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,GAChD,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC;AAyBpC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EACtD,KAAK,EAAE,EAAE,EACT,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,OAAO,GAC3D,OAAO,CAAC;AAEX,wBAAgB,IAAI,CAAC,CAAC,EACpB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,GAChD,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC;AAyBpC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,EAC9B,OAAO,SAAS,CAAC,EAAE,EACnB,OAAO,QAAQ,CAAC,MAAM,KACrB,OAAgD,CAAC"}
@@ -136,6 +136,46 @@ const isArrayOfLength = (array, len) => array.length === len;
136
136
  * ```
137
137
  */
138
138
  const isArrayAtLeastLength = (array, len) => array.length >= len;
139
+ /**
140
+ * Checks if an array has at most a specific length.
141
+ *
142
+ * @example
143
+ *
144
+ * ```ts
145
+ * const pair: readonly number[] = [1, 2] as const;
146
+ *
147
+ * const triple: readonly number[] = [1, 2, 3] as const;
148
+ *
149
+ * assert.isTrue(Arr.isArrayAtMostLength(pair, 2));
150
+ *
151
+ * assert.isFalse(Arr.isArrayAtMostLength(triple, 2));
152
+ *
153
+ * if (Arr.isArrayAtMostLength(pair, 2)) {
154
+ * assert.isTrue(pair.length <= 2);
155
+ * }
156
+ * ```
157
+ */
158
+ const isArrayAtMostLength = (array, len) => array.length <= len;
159
+ /**
160
+ * Checks if an array's length is within a specific inclusive range.
161
+ *
162
+ * @example
163
+ *
164
+ * ```ts
165
+ * const pair: readonly number[] = [1, 2] as const;
166
+ *
167
+ * const quad: readonly number[] = [1, 2, 3, 4] as const;
168
+ *
169
+ * assert.isTrue(Arr.isArrayBoundedLength(pair, 1, 3));
170
+ *
171
+ * assert.isFalse(Arr.isArrayBoundedLength(quad, 1, 3));
172
+ *
173
+ * if (Arr.isArrayBoundedLength(pair, 1, 3)) {
174
+ * assert.isTrue(pair.length >= 1 && pair.length <= 3);
175
+ * }
176
+ * ```
177
+ */
178
+ const isArrayBoundedLength = (array, min, max) => array.length >= min && array.length <= max;
139
179
  function every(...args) {
140
180
  switch (args.length) {
141
181
  case 2: {
@@ -179,5 +219,5 @@ function some(...args) {
179
219
  */
180
220
  const indexIsInRange = (array, index) => Num.isInRange(0, array.length)(index);
181
221
 
182
- export { every, indexIsInRange, isArray, isArrayAtLeastLength, isArrayOfLength, isEmpty, isNonEmpty, some };
222
+ export { every, indexIsInRange, isArray, isArrayAtLeastLength, isArrayAtMostLength, isArrayBoundedLength, isArrayOfLength, isEmpty, isNonEmpty, some };
183
223
  //# sourceMappingURL=array-utils-validation.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"array-utils-validation.mjs","sources":["../../../src/array/impl/array-utils-validation.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,OAAO,GAAG,CAAK,KAAQ,KAClC,KAAK,CAAC,OAAO,CAAC,KAAK;AAarB;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,OAAO,GAAG,CAAK,KAAmB,KAC7C,KAAK,CAAC,MAAM,KAAK;AAEnB;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,UAAU,GAAG,CACxB,KAAmB,KACW,KAAK,CAAC,MAAM,GAAG;AAE/C;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,eAAe,GAAG,CAC7B,KAAmB,EACnB,GAAM,KAC2B,KAAK,CAAC,MAAM,KAAK;AAEpD;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,oBAAoB,GAAG,CAClC,KAAmB,EACnB,GAAM,KAC6B,KAAK,CAAC,MAAM,IAAI;AAyC/C,SAAU,KAAK,CACnB,GAAG,IAK6D,EAAA;AAEhE,IAAA,QAAQ,IAAI,CAAC,MAAM;QACjB,KAAK,CAAC,EAAE;AACN,YAAA,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,IAAI;YAE/B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD;QAEA,KAAK,CAAC,EAAE;AACN,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI;YAExB,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC;QAC3C;;AAEJ;AA8BM,SAAU,IAAI,CAClB,GAAG,IAK6D,EAAA;AAEhE,IAAA,QAAQ,IAAI,CAAC,MAAM;QACjB,KAAK,CAAC,EAAE;AACN,YAAA,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,IAAI;YAE/B,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD;QAEA,KAAK,CAAC,EAAE;AACN,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI;YAExB,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1C;;AAEJ;AAEA;;;;;;;;;;;;;;;;AAgBG;AACI,MAAM,cAAc,GAAG,CAC5B,KAAmB,EACnB,KAAsB,KACV,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK;;;;"}
1
+ {"version":3,"file":"array-utils-validation.mjs","sources":["../../../src/array/impl/array-utils-validation.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,OAAO,GAAG,CAAK,KAAQ,KAClC,KAAK,CAAC,OAAO,CAAC,KAAK;AAarB;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,OAAO,GAAG,CAAK,KAAmB,KAC7C,KAAK,CAAC,MAAM,KAAK;AAEnB;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,UAAU,GAAG,CACxB,KAAmB,KACW,KAAK,CAAC,MAAM,GAAG;AAE/C;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,eAAe,GAAG,CAC7B,KAAmB,EACnB,GAAM,KAC2B,KAAK,CAAC,MAAM,KAAK;AAEpD;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,oBAAoB,GAAG,CAClC,KAAmB,EACnB,GAAM,KAC6B,KAAK,CAAC,MAAM,IAAI;AAErD;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,mBAAmB,GAAG,CACjC,KAAmB,EACnB,GAAM,KAC4B,KAAK,CAAC,MAAM,IAAI;AAEpD;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,oBAAoB,GAAG,CAKlC,KAAmB,EACnB,GAAQ,EACR,GAAQ,KAER,KAAK,CAAC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI;AAyCnC,SAAU,KAAK,CACnB,GAAG,IAK6D,EAAA;AAEhE,IAAA,QAAQ,IAAI,CAAC,MAAM;QACjB,KAAK,CAAC,EAAE;AACN,YAAA,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,IAAI;YAE/B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD;QAEA,KAAK,CAAC,EAAE;AACN,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI;YAExB,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC;QAC3C;;AAEJ;AA8BM,SAAU,IAAI,CAClB,GAAG,IAK6D,EAAA;AAEhE,IAAA,QAAQ,IAAI,CAAC,MAAM;QACjB,KAAK,CAAC,EAAE;AACN,YAAA,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,IAAI;YAE/B,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD;QAEA,KAAK,CAAC,EAAE;AACN,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI;YAExB,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1C;;AAEJ;AAEA;;;;;;;;;;;;;;;;AAgBG;AACI,MAAM,cAAc,GAAG,CAC5B,KAAmB,EACnB,KAAsB,KACV,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK;;;;"}
@@ -9,5 +9,5 @@ export { length, size } from './array-utils-size.mjs';
9
9
  export { sliceClamped } from './array-utils-slice-clamped.mjs';
10
10
  export { butLast, drop, rest, skip, skipLast, tail, take, takeLast } from './array-utils-slicing.mjs';
11
11
  export { cartesianProduct, chunk, concat, filter, filterNot, flat, flatMap, groupBy, map, partition, scan, toReversed, toSorted, toSortedBy, uniq, uniqBy, zip } from './array-utils-transformation.mjs';
12
- export { every, indexIsInRange, isArray, isArrayAtLeastLength, isArrayOfLength, isEmpty, isNonEmpty, some } from './array-utils-validation.mjs';
12
+ export { every, indexIsInRange, isArray, isArrayAtLeastLength, isArrayAtMostLength, isArrayBoundedLength, isArrayOfLength, isEmpty, isNonEmpty, some } from './array-utils-validation.mjs';
13
13
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-data-forge",
3
- "version": "7.0.1",
3
+ "version": "7.1.0",
4
4
  "private": false,
5
5
  "keywords": [
6
6
  "typescript",
@@ -1,5 +1,7 @@
1
1
  import {
2
2
  type ArrayAtLeastLen,
3
+ type ArrayAtMostLen,
4
+ type ArrayBoundedLen,
3
5
  type ArrayOfLength,
4
6
  type BoolOr,
5
7
  type NonEmptyArray,
@@ -136,6 +138,60 @@ export const isArrayAtLeastLength = <E, N extends SizeType.ArgArr>(
136
138
  len: N,
137
139
  ): array is ArrayAtLeastLen<N, E> => array.length >= len;
138
140
 
141
+ /**
142
+ * Checks if an array has at most a specific length.
143
+ *
144
+ * @example
145
+ *
146
+ * ```ts
147
+ * const pair: readonly number[] = [1, 2] as const;
148
+ *
149
+ * const triple: readonly number[] = [1, 2, 3] as const;
150
+ *
151
+ * assert.isTrue(Arr.isArrayAtMostLength(pair, 2));
152
+ *
153
+ * assert.isFalse(Arr.isArrayAtMostLength(triple, 2));
154
+ *
155
+ * if (Arr.isArrayAtMostLength(pair, 2)) {
156
+ * assert.isTrue(pair.length <= 2);
157
+ * }
158
+ * ```
159
+ */
160
+ export const isArrayAtMostLength = <E, N extends SizeType.ArgArr>(
161
+ array: readonly E[],
162
+ len: N,
163
+ ): array is ArrayAtMostLen<N, E> => array.length <= len;
164
+
165
+ /**
166
+ * Checks if an array's length is within a specific inclusive range.
167
+ *
168
+ * @example
169
+ *
170
+ * ```ts
171
+ * const pair: readonly number[] = [1, 2] as const;
172
+ *
173
+ * const quad: readonly number[] = [1, 2, 3, 4] as const;
174
+ *
175
+ * assert.isTrue(Arr.isArrayBoundedLength(pair, 1, 3));
176
+ *
177
+ * assert.isFalse(Arr.isArrayBoundedLength(quad, 1, 3));
178
+ *
179
+ * if (Arr.isArrayBoundedLength(pair, 1, 3)) {
180
+ * assert.isTrue(pair.length >= 1 && pair.length <= 3);
181
+ * }
182
+ * ```
183
+ */
184
+ export const isArrayBoundedLength = <
185
+ E,
186
+ Min extends SizeType.ArgArr,
187
+ Max extends SizeType.ArgArr,
188
+ >(
189
+ array: readonly E[],
190
+ min: Min,
191
+ max: Max,
192
+ ): array is ArrayBoundedLen<Min, Max, E> =>
193
+ array.length >= min && array.length <= max;
194
+
139
195
  /**
140
196
  * Tests whether all elements in an array pass a test implemented by a predicate.
141
197
  *
@@ -1,10 +1,17 @@
1
- import { type ArrayAtLeastLen, type ArrayOfLength } from 'ts-type-forge';
1
+ import {
2
+ type ArrayAtLeastLen,
3
+ type ArrayAtMostLen,
4
+ type ArrayBoundedLen,
5
+ type ArrayOfLength,
6
+ } from 'ts-type-forge';
2
7
  import { expectType } from '../../expect-type.mjs';
3
8
  import {
4
9
  every,
5
10
  indexIsInRange,
6
11
  isArray,
7
12
  isArrayAtLeastLength,
13
+ isArrayAtMostLength,
14
+ isArrayBoundedLength,
8
15
  isArrayOfLength,
9
16
  isEmpty,
10
17
  isNonEmpty,
@@ -584,6 +591,158 @@ describe('Arr validations', () => {
584
591
  });
585
592
  });
586
593
 
594
+ describe(isArrayAtMostLength, () => {
595
+ test('should return true if array length is less than or equal to specified length', () => {
596
+ const arr = [1, 2, 3] as const;
597
+
598
+ assert.isTrue(isArrayAtMostLength(arr, 3));
599
+
600
+ if (isArrayAtMostLength(arr, 3)) {
601
+ expectType<typeof arr, readonly [1, 2, 3]>('=');
602
+ }
603
+
604
+ assert.isTrue(isArrayAtMostLength(arr, 4));
605
+
606
+ if (isArrayAtMostLength(arr, 4)) {
607
+ expectType<typeof arr, readonly [1, 2, 3]>('=');
608
+ }
609
+ });
610
+
611
+ test('should return false if array length is greater than specified length', () => {
612
+ const arr = [1, 2, 3] as const;
613
+
614
+ assert.isFalse(isArrayAtMostLength(arr, 2));
615
+ });
616
+
617
+ test('should return true for empty array and length 0', () => {
618
+ const arr = [] as const;
619
+
620
+ assert.isTrue(isArrayAtMostLength(arr, 0));
621
+
622
+ if (isArrayAtMostLength(arr, 0)) {
623
+ expectType<typeof arr, readonly []>('=');
624
+ }
625
+ });
626
+
627
+ test('should return false for non-empty array and length 0', () => {
628
+ const arr = [1] as const;
629
+
630
+ assert.isFalse(isArrayAtMostLength(arr, 0));
631
+ });
632
+
633
+ test('should work with unknown array type', () => {
634
+ const mut_arr: number[] = [1, 2];
635
+
636
+ assert.isTrue(isArrayAtMostLength(mut_arr, 2));
637
+
638
+ // transformer-ignore-next-line
639
+ expectType<typeof mut_arr, number[] & ArrayAtMostLen<2, number>>('=');
640
+
641
+ assert.isFalse(isArrayAtMostLength(mut_arr, 1));
642
+ });
643
+
644
+ test('should return true for arrays of at most specified length (additional)', () => {
645
+ assert.isTrue(isArrayAtMostLength([1, 2, 3], 3));
646
+
647
+ assert.isTrue(isArrayAtMostLength([1, 2, 3], 4));
648
+
649
+ assert.isTrue(isArrayAtMostLength([], 0));
650
+ });
651
+
652
+ test('should return false for arrays longer than specified length (additional)', () => {
653
+ assert.isFalse(isArrayAtMostLength([1, 2, 3], 2));
654
+
655
+ assert.isFalse(isArrayAtMostLength([1, 2, 3], 0));
656
+ });
657
+
658
+ test('should work as type guard for at most length (additional)', () => {
659
+ const array: readonly number[] = [1, 2] as const;
660
+
661
+ if (isArrayAtMostLength(array, 3)) {
662
+ expectType<typeof array, ArrayAtMostLen<3, number>>('=');
663
+
664
+ expect(array.length).toBeLessThanOrEqual(3);
665
+ }
666
+ });
667
+ });
668
+
669
+ describe(isArrayBoundedLength, () => {
670
+ test('should return true if array length is within the specified range', () => {
671
+ const arr = [1, 2, 3] as const;
672
+
673
+ assert.isTrue(isArrayBoundedLength(arr, 1, 3));
674
+
675
+ if (isArrayBoundedLength(arr, 1, 3)) {
676
+ expectType<typeof arr, readonly [1, 2, 3]>('=');
677
+ }
678
+
679
+ assert.isTrue(isArrayBoundedLength(arr, 3, 5));
680
+
681
+ if (isArrayBoundedLength(arr, 3, 5)) {
682
+ expectType<typeof arr, readonly [1, 2, 3]>('=');
683
+ }
684
+ });
685
+
686
+ test('should return false if array length is below the specified range', () => {
687
+ const arr = [1, 2, 3] as const;
688
+
689
+ assert.isFalse(isArrayBoundedLength(arr, 4, 5));
690
+ });
691
+
692
+ test('should return false if array length is above the specified range', () => {
693
+ const arr = [1, 2, 3] as const;
694
+
695
+ assert.isFalse(isArrayBoundedLength(arr, 0, 2));
696
+ });
697
+
698
+ test('should return true for empty array and range including 0', () => {
699
+ const arr = [] as const;
700
+
701
+ assert.isTrue(isArrayBoundedLength(arr, 0, 2));
702
+
703
+ if (isArrayBoundedLength(arr, 0, 2)) {
704
+ expectType<typeof arr, readonly []>('=');
705
+ }
706
+ });
707
+
708
+ test('should work with unknown array type', () => {
709
+ const mut_arr: number[] = [1, 2];
710
+
711
+ assert.isTrue(isArrayBoundedLength(mut_arr, 1, 3));
712
+
713
+ // transformer-ignore-next-line
714
+ expectType<typeof mut_arr, number[] & ArrayBoundedLen<1, 3, number>>('=');
715
+
716
+ assert.isFalse(isArrayBoundedLength(mut_arr, 3, 5));
717
+ });
718
+
719
+ test('should return true for arrays within specified range (additional)', () => {
720
+ assert.isTrue(isArrayBoundedLength([1, 2, 3], 1, 3));
721
+
722
+ assert.isTrue(isArrayBoundedLength([1, 2, 3], 3, 3));
723
+
724
+ assert.isTrue(isArrayBoundedLength([], 0, 0));
725
+ });
726
+
727
+ test('should return false for arrays outside specified range (additional)', () => {
728
+ assert.isFalse(isArrayBoundedLength([1, 2, 3], 4, 5));
729
+
730
+ assert.isFalse(isArrayBoundedLength([1, 2, 3], 0, 2));
731
+ });
732
+
733
+ test('should work as type guard for bounded length (additional)', () => {
734
+ const array: readonly number[] = [1, 2] as const;
735
+
736
+ if (isArrayBoundedLength(array, 1, 3)) {
737
+ expectType<typeof array, ArrayBoundedLen<1, 3, number>>('=');
738
+
739
+ expect(array.length).toBeGreaterThanOrEqual(1);
740
+
741
+ expect(array.length).toBeLessThanOrEqual(3);
742
+ }
743
+ });
744
+ });
745
+
587
746
  describe(every, () => {
588
747
  test('should return true when all elements satisfy predicate', () => {
589
748
  const evens = [2, 4, 6, 8] as const;