@xylabs/vitest-matchers 6.0.2 → 6.0.3

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.
@@ -96,7 +96,7 @@ export declare const matchers: {
96
96
  * @param received - The array, string, or object to search within.
97
97
  * @param value - The value to look for.
98
98
  */
99
- toInclude(received: unknown, value: any): {
99
+ toInclude(received: unknown, value: unknown): {
100
100
  pass: boolean;
101
101
  message: () => string;
102
102
  };
@@ -1 +1 @@
1
- {"version":3,"file":"customMatchers.d.ts","sourceRoot":"","sources":["../../src/customMatchers.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,4CAA4C;IAC5C,IAAI,EAAE,OAAO,CAAA;CACd;AAqBD,uFAAuF;AACvF,eAAO,MAAM,QAAQ;IACnB;;;;OAIG;8BACuB,OAAO,gBAAgB,MAAM,GAAG,iBAAiB;IAc3E;;;OAGG;wBACiB,OAAO,GAAG,iBAAiB;IAY/C;;;;OAIG;wBACiB,OAAO,YAAY,OAAO,EAAE,GAAG,iBAAiB;IAcpE;;;OAGG;2BACoB,MAAM,GAAG,iBAAiB;IAkBjD;;;OAGG;2BACoB,MAAM,GAAG,iBAAiB;IAkBjD;;;OAGG;2BACoB,OAAO;IAC9B;;;OAGG;6BACsB,OAAO;IAChC;;;OAGG;2BACoB,OAAO;IAC9B;;;OAGG;yBACkB,OAAO,GAAG,iBAAiB;IAYhD;;;OAGG;0BACmB,MAAM,GAAG,iBAAiB;IAkBhD;;;OAGG;wBACiB,OAAO,GAAG,iBAAiB;IAY/C;;;OAGG;uBACgB,OAAO,GAAG,iBAAiB;IAY9C;;;;OAIG;iCAC0B,OAAO,kBAAkB,OAAO,EAAE;;;;IA0B/D;;;;OAIG;2BACoB,MAAM,OAAO,MAAM;;;;IAY1C;;;;OAIG;wBAEiB,OAAO,SAAS,GAAG;;;;IAqBvC;;;;OAIG;kCAC2B,OAAO,EAAE,YAAY,OAAO,EAAE,GAAG,iBAAiB;IAwBhF;;;;OAIG;+BACwB,MAAM,gBAAgB,MAAM,EAAE,GAAG,iBAAiB;IA+B7E;;;;OAIG;8BACuB,MAAM,kBAAkB,OAAO,EAAE,GAAG,iBAAiB;IAgD/E;;;OAGG;wBACiB,OAAO,GAAG,iBAAiB;IA6B/C;;;OAGG;4BAES,OAAO;;;;CAapB,CAAA"}
1
+ {"version":3,"file":"customMatchers.d.ts","sourceRoot":"","sources":["../../src/customMatchers.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,4CAA4C;IAC5C,IAAI,EAAE,OAAO,CAAA;CACd;AA4BD,uFAAuF;AACvF,eAAO,MAAM,QAAQ;IACnB;;;;OAIG;8BACuB,OAAO,gBAAgB,MAAM,GAAG,iBAAiB;IAc3E;;;OAGG;wBACiB,OAAO,GAAG,iBAAiB;IAY/C;;;;OAIG;wBACiB,OAAO,YAAY,OAAO,EAAE,GAAG,iBAAiB;IAcpE;;;OAGG;2BACoB,MAAM,GAAG,iBAAiB;IAkBjD;;;OAGG;2BACoB,MAAM,GAAG,iBAAiB;IAkBjD;;;OAGG;2BACoB,OAAO;IAC9B;;;OAGG;6BACsB,OAAO;IAChC;;;OAGG;2BACoB,OAAO;IAC9B;;;OAGG;yBACkB,OAAO,GAAG,iBAAiB;IAYhD;;;OAGG;0BACmB,MAAM,GAAG,iBAAiB;IAkBhD;;;OAGG;wBACiB,OAAO,GAAG,iBAAiB;IAY/C;;;OAGG;uBACgB,OAAO,GAAG,iBAAiB;IAY9C;;;;OAIG;iCAC0B,OAAO,kBAAkB,OAAO,EAAE;;;;IA0B/D;;;;OAIG;2BACoB,MAAM,OAAO,MAAM;;;;IAY1C;;;;OAIG;wBACiB,OAAO,SAAS,OAAO;;;;IAqB3C;;;;OAIG;kCAC2B,OAAO,EAAE,YAAY,OAAO,EAAE,GAAG,iBAAiB;IAwBhF;;;;OAIG;+BACwB,MAAM,gBAAgB,MAAM,EAAE,GAAG,iBAAiB;IA+B7E;;;;OAIG;8BACuB,MAAM,kBAAkB,OAAO,EAAE,GAAG,iBAAiB;IAiD/E;;;OAGG;wBACiB,OAAO,GAAG,iBAAiB;IA8B/C;;;OAGG;4BAES,OAAO;;;;CAapB,CAAA"}
@@ -1,11 +1,17 @@
1
1
  // src/customMatchers.ts
2
+ var formatValue = (value) => {
3
+ if (typeof value === "string") return value;
4
+ if (typeof value === "number" && !Number.isFinite(value)) return String(value);
5
+ const json = JSON.stringify(value);
6
+ return json ?? String(value);
7
+ };
2
8
  function toBeType(received, expectedType) {
3
9
  const pass = typeof received === expectedType && !Number.isNaN(received);
4
10
  return pass ? {
5
- message: () => `expected ${received} not to be a ${expectedType}`,
11
+ message: () => `expected ${formatValue(received)} not to be a ${expectedType}`,
6
12
  pass: true
7
13
  } : {
8
- message: () => `expected ${received} to be a ${expectedType}`,
14
+ message: () => `expected ${formatValue(received)} to be a ${expectedType}`,
9
15
  pass: false
10
16
  };
11
17
  }
@@ -48,10 +54,10 @@ var matchers = {
48
54
  const pass = expected.includes(received);
49
55
  return pass ? {
50
56
  pass: true,
51
- message: () => `expected ${received} not to be one of ${JSON.stringify(expected)}`
57
+ message: () => `expected ${formatValue(received)} not to be one of ${JSON.stringify(expected)}`
52
58
  } : {
53
59
  pass: false,
54
- message: () => `expected ${received} to be one of ${JSON.stringify(expected)}`
60
+ message: () => `expected ${formatValue(received)} to be one of ${JSON.stringify(expected)}`
55
61
  };
56
62
  },
57
63
  /**
@@ -110,10 +116,10 @@ var matchers = {
110
116
  toBeObject(received) {
111
117
  const pass = typeof received === "object" && !Array.isArray(received) && received !== null;
112
118
  return pass ? {
113
- message: () => `expected ${received} to be object`,
119
+ message: () => `expected ${formatValue(received)} to be object`,
114
120
  pass: true
115
121
  } : {
116
- message: () => `expected ${received} to be an object but was ${Array.isArray(received) ? "array" : typeof received}`,
122
+ message: () => `expected ${formatValue(received)} to be an object but was ${Array.isArray(received) ? "array" : typeof received}`,
117
123
  pass: false
118
124
  };
119
125
  },
@@ -141,10 +147,10 @@ var matchers = {
141
147
  toBeFalse(received) {
142
148
  const pass = received === false;
143
149
  return pass ? {
144
- message: () => `expected ${received} to be false`,
150
+ message: () => `expected ${formatValue(received)} to be false`,
145
151
  pass: true
146
152
  } : {
147
- message: () => `expected ${received} to be false but was not false`,
153
+ message: () => `expected ${formatValue(received)} to be false but was not false`,
148
154
  pass: false
149
155
  };
150
156
  },
@@ -155,10 +161,10 @@ var matchers = {
155
161
  toBeTrue(received) {
156
162
  const pass = received === true;
157
163
  return pass ? {
158
- message: () => `expected ${received} to be true`,
164
+ message: () => `expected ${formatValue(received)} to be true`,
159
165
  pass: true
160
166
  } : {
161
- message: () => `expected ${received} to be true but was not true`,
167
+ message: () => `expected ${formatValue(received)} to be true but was not true`,
162
168
  pass: false
163
169
  };
164
170
  },
@@ -205,13 +211,12 @@ var matchers = {
205
211
  * @param received - The array, string, or object to search within.
206
212
  * @param value - The value to look for.
207
213
  */
208
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
214
  toInclude(received, value) {
210
215
  let pass;
211
216
  if (Array.isArray(received)) {
212
217
  pass = received.includes(value);
213
218
  } else if (typeof received === "string") {
214
- pass = received.includes(value);
219
+ pass = received.includes(String(value));
215
220
  } else if (typeof received === "object" && received !== null) {
216
221
  pass = Object.values(received).includes(value);
217
222
  } else {
@@ -296,11 +301,13 @@ var matchers = {
296
301
  const deepEqual = (a, b) => {
297
302
  if (a === b) return true;
298
303
  if (typeof a !== typeof b) return false;
299
- if (a && b && typeof a === "object") {
304
+ if (a !== null && b !== null && typeof a === "object" && typeof b === "object") {
300
305
  const aKeys = Object.keys(a);
301
306
  const bKeys = Object.keys(b);
302
307
  if (aKeys.length !== bKeys.length) return false;
303
- return aKeys.every((key) => deepEqual(a[key], b[key]));
308
+ const aRecord = a;
309
+ const bRecord = b;
310
+ return aKeys.every((key) => deepEqual(aRecord[key], bRecord[key]));
304
311
  }
305
312
  return false;
306
313
  };
@@ -322,14 +329,15 @@ var matchers = {
322
329
  * @param received - The value to check.
323
330
  */
324
331
  toBeEmpty(received) {
325
- let isEmpty = false;
326
- if (Array.isArray(received) || typeof received === "string") {
327
- isEmpty = received.length === 0;
328
- } else if (received && typeof received === "object") {
329
- isEmpty = Object.keys(received).length === 0;
330
- } else if (received instanceof Map || received instanceof Set) {
331
- isEmpty = received.size === 0;
332
- } else {
332
+ const isEmpty = (() => {
333
+ if (Array.isArray(received) || typeof received === "string") {
334
+ return received.length === 0;
335
+ }
336
+ if (received !== null && typeof received === "object") {
337
+ return Object.keys(received).length === 0;
338
+ }
339
+ })();
340
+ if (isEmpty === void 0) {
333
341
  return {
334
342
  pass: false,
335
343
  message: () => `Expected value to be an empty array, string, object, Map, or Set, but received ${typeof received}.`
@@ -351,7 +359,7 @@ var matchers = {
351
359
  const isValid = received instanceof Date && !Number.isNaN(received.getTime());
352
360
  return {
353
361
  pass: isValid,
354
- message: () => isValid ? `expected ${received} not to be a valid Date` : `expected ${received} to be a valid Date`
362
+ message: () => isValid ? `expected ${received.toISOString()} not to be a valid Date` : `expected ${formatValue(received)} to be a valid Date`
355
363
  };
356
364
  }
357
365
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/customMatchers.ts"],
4
- "sourcesContent": ["/** Result returned by a custom matcher function. */\nexport interface ExpectationResult {\n /** The actual value received by the matcher. */\n actual?: unknown\n /** The expected value the matcher compared against. */\n expected?: unknown\n /** Returns a human-readable failure or negation message. */\n message: () => string\n /** Whether the matcher assertion passed. */\n pass: boolean\n}\n\n/**\n * Checks whether the received value matches the expected JavaScript type and is not NaN.\n * @param received - The value to check.\n * @param expectedType - The expected `typeof` string (e.g. 'number', 'string').\n * @returns An ExpectationResult indicating pass or fail.\n */\nfunction toBeType(received: unknown, expectedType: string): ExpectationResult {\n const pass = typeof received === expectedType && !Number.isNaN(received)\n return pass\n ? {\n message: () => `expected ${received} not to be a ${expectedType}`,\n pass: true,\n }\n : {\n message: () => `expected ${received} to be a ${expectedType}`,\n pass: false,\n }\n}\n\n/** Collection of custom Vitest matchers extending the built-in `expect` assertions. */\nexport const matchers = {\n /**\n * Asserts the received value is an array with the specified length.\n * @param received - The value to check.\n * @param expectedSize - The expected array length.\n */\n toBeArrayOfSize(received: unknown, expectedSize: number): ExpectationResult {\n const pass = Array.isArray(received) && received.length === expectedSize\n return pass\n ? {\n message: () => `expected array not to have size ${expectedSize}, but received array of size ${received.length}`,\n pass: true,\n }\n : {\n message: () => Array.isArray(received)\n ? `expected array of size ${expectedSize}, but received array of size ${received.length}`\n : `expected array of size ${expectedSize}, but received a non-array`,\n pass: false,\n }\n },\n /**\n * Asserts the received value is an array.\n * @param received - The value to check.\n */\n toBeArray(received: unknown): ExpectationResult {\n const pass = Array.isArray(received)\n return pass\n ? {\n message: () => 'expected array',\n pass: true,\n }\n : {\n message: () => `expected array, but received ${typeof received}`,\n pass: false,\n }\n },\n /**\n * Asserts the received value is one of the values in the expected array.\n * @param received - The value to check.\n * @param expected - The array of acceptable values.\n */\n toBeOneOf(received: unknown, expected: unknown[]): ExpectationResult {\n const pass = expected.includes(received)\n return pass\n ? {\n pass: true,\n message: () =>\n `expected ${received} not to be one of ${JSON.stringify(expected)}`,\n }\n : {\n pass: false,\n message: () =>\n `expected ${received} to be one of ${JSON.stringify(expected)}`,\n }\n },\n /**\n * Asserts the received number is negative (less than zero).\n * @param received - The number to check.\n */\n toBeNegative(received: number): ExpectationResult {\n if (typeof received !== 'number') {\n throw new TypeError(`Expected a number, but received ${typeof received}`)\n }\n\n const pass = received < 0\n return pass\n ? {\n pass: true,\n message: () =>\n `expected ${received} not to be negative`,\n }\n : {\n pass: false,\n message: () =>\n `expected ${received} to be negative`,\n }\n },\n /**\n * Asserts the received number is positive (greater than zero).\n * @param received - The number to check.\n */\n toBePositive(received: number): ExpectationResult {\n if (typeof received !== 'number') {\n throw new TypeError(`Expected a number, but received ${typeof received}`)\n }\n\n const pass = received > 0\n return pass\n ? {\n pass: true,\n message: () =>\n `expected ${received} not to be positive`,\n }\n : {\n pass: false,\n message: () =>\n `expected ${received} to be positive`,\n }\n },\n /**\n * Asserts the received value is of type `number` and not NaN.\n * @param received - The value to check.\n */\n toBeNumber: (received: unknown) => toBeType(received, 'number'),\n /**\n * Asserts the received value is of type `function`.\n * @param received - The value to check.\n */\n toBeFunction: (received: unknown) => toBeType(received, 'function'),\n /**\n * Asserts the received value is of type `string`.\n * @param received - The value to check.\n */\n toBeString: (received: unknown) => toBeType(received, 'string'),\n /**\n * Asserts the received value is a plain object (not an array or null).\n * @param received - The value to check.\n */\n toBeObject(received: unknown): ExpectationResult {\n const pass = typeof received === 'object' && !Array.isArray(received) && received !== null\n return pass\n ? {\n message: () => `expected ${received} to be object`,\n pass: true,\n }\n : {\n message: () => `expected ${received} to be an object but was ${Array.isArray(received) ? 'array' : typeof received}`,\n pass: false,\n }\n },\n /**\n * Asserts the received number is an integer.\n * @param received - The number to check.\n */\n toBeInteger(received: number): ExpectationResult {\n if (typeof received !== 'number') {\n throw new TypeError(`Expected a number, but received ${typeof received}`)\n }\n\n const pass = Number.isInteger(received)\n return pass\n ? {\n pass: true,\n message: () =>\n `expected ${received} not to be an integer`,\n }\n : {\n pass: false,\n message: () =>\n `expected ${received} to be an integer`,\n }\n },\n /**\n * Asserts the received value is strictly `false`.\n * @param received - The value to check.\n */\n toBeFalse(received: unknown): ExpectationResult {\n const pass = received === false\n return pass\n ? {\n message: () => `expected ${received} to be false`,\n pass: true,\n }\n : {\n message: () => `expected ${received} to be false but was not false`,\n pass: false,\n }\n },\n /**\n * Asserts the received value is strictly `true`.\n * @param received - The value to check.\n */\n toBeTrue(received: unknown): ExpectationResult {\n const pass = received === true\n return pass\n ? {\n message: () => `expected ${received} to be true`,\n pass: true,\n }\n : {\n message: () => `expected ${received} to be true but was not true`,\n pass: false,\n }\n },\n /**\n * Asserts that all expected values are present in the received array or object values.\n * @param received - The array or object to check.\n * @param expectedValues - The values that must all be present.\n */\n toContainAllValues(received: unknown, expectedValues: unknown[]) {\n let receivedValues: unknown[]\n\n // Check if received is an array or an object\n if (Array.isArray(received)) {\n receivedValues = received\n } else if (typeof received === 'object' && received !== null) {\n receivedValues = Object.values(received)\n } else {\n return {\n pass: false,\n message: () => `Expected an array or object, but received ${typeof received}.`,\n }\n }\n\n // Check if all expected values are in the received values\n const pass = expectedValues.every(value => receivedValues.includes(value))\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected ${JSON.stringify(received)} not to contain all values ${JSON.stringify(expectedValues)}, but it does.`\n : `Expected ${JSON.stringify(received)} to contain all values ${JSON.stringify(expectedValues)}, but it does not.`,\n }\n },\n /**\n * Asserts that the received object contains the specified key.\n * @param received - The object to check.\n * @param key - The key that should be present.\n */\n toContainKey(received: object, key: string) {\n const pass = Object.prototype.hasOwnProperty.call(received, key)\n return pass\n ? {\n pass: true,\n message: () => `Expected object not to contain key \"${key}\", but it does.`,\n }\n : {\n pass: false,\n message: () => `Expected object to contain key \"${key}\", but it does not.`,\n }\n },\n /**\n * Asserts that the received array, string, or object values include the specified value.\n * @param received - The array, string, or object to search within.\n * @param value - The value to look for.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toInclude(received: unknown, value: any) {\n let pass: boolean\n\n if (Array.isArray(received)) {\n pass = received.includes(value)\n } else if (typeof received === 'string') {\n pass = received.includes(value)\n } else if (typeof received === 'object' && received !== null) {\n pass = Object.values(received).includes(value)\n } else {\n pass = false\n }\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected ${JSON.stringify(received)} not to include ${JSON.stringify(value)}, but it does.`\n : `Expected ${JSON.stringify(received)} to include ${JSON.stringify(value)}, but it does not.`,\n }\n },\n /**\n * Asserts that the received array includes all members of the expected array.\n * @param received - The array to check.\n * @param expected - The members that must all be present.\n */\n toIncludeAllMembers(received: unknown[], expected: unknown[]): ExpectationResult {\n if (!Array.isArray(received) || !Array.isArray(expected)) {\n return {\n pass: false,\n message: () => 'Expected both received and expected values to be arrays.',\n }\n }\n\n const missingMembers = expected.filter(item => !received.includes(item))\n\n return missingMembers.length === 0\n ? {\n pass: true,\n message: () =>\n `Expected array not to include all members of ${JSON.stringify(expected)}, but it does.`,\n }\n : {\n pass: false,\n message: () =>\n `Expected array to include all members of ${JSON.stringify(expected)}. Missing members: ${JSON.stringify(\n missingMembers,\n )}.`,\n }\n },\n /**\n * Asserts that the received object contains all of the specified keys.\n * @param received - The object to check.\n * @param expectedKeys - The keys that must all be present.\n */\n toContainAllKeys(received: object, expectedKeys: string[]): ExpectationResult {\n if (typeof received !== 'object' || received === null) {\n return {\n pass: false,\n message: () => `Expected ${JSON.stringify(received)} to be an object.`,\n }\n }\n\n if (!Array.isArray(expectedKeys)) {\n return {\n pass: false,\n message: () => `Expected keys to be an array, but received ${JSON.stringify(expectedKeys)}.`,\n }\n }\n\n const missingKeys = expectedKeys.filter(key => !(key in received))\n\n return missingKeys.length === 0\n ? {\n pass: true,\n message: () =>\n `Expected object not to contain all keys ${JSON.stringify(expectedKeys)}, but it does.`,\n }\n : {\n pass: false,\n message: () =>\n `Expected object to contain all keys ${JSON.stringify(expectedKeys)}. Missing keys: ${JSON.stringify(\n missingKeys,\n )}.`,\n }\n },\n /**\n * Asserts that the received object contains all of the specified values (using deep equality).\n * @param received - The object to check.\n * @param expectedValues - The values that must all be present.\n */\n toContainValues(received: object, expectedValues: unknown[]): ExpectationResult {\n if (typeof received !== 'object' || received === null) {\n return {\n pass: false,\n message: () => `Expected ${JSON.stringify(received)} to be an object.`,\n }\n }\n\n if (!Array.isArray(expectedValues)) {\n return {\n pass: false,\n message: () => `Expected values to be an array, but received ${JSON.stringify(expectedValues)}.`,\n }\n }\n\n const objectValues = Object.values(received)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const deepEqual = (a: any, b: any): boolean => {\n if (a === b) return true\n if (typeof a !== typeof b) return false\n if (a && b && typeof a === 'object') {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) return false\n return aKeys.every(key => deepEqual(a[key], b[key]))\n }\n return false\n }\n\n const missingValues = expectedValues.filter(\n expectedValue => !objectValues.some(value => deepEqual(value, expectedValue)),\n )\n\n return missingValues.length === 0\n ? {\n pass: true,\n message: () =>\n `Expected object not to contain all values ${JSON.stringify(expectedValues)}, but it does.`,\n }\n : {\n pass: false,\n message: () =>\n `Expected object to contain all values ${JSON.stringify(expectedValues)}. Missing values: ${JSON.stringify(\n missingValues,\n )}.`,\n }\n },\n /**\n * Asserts the received value is empty (zero-length array/string, empty object, or empty Map/Set).\n * @param received - The value to check.\n */\n toBeEmpty(received: unknown): ExpectationResult {\n let isEmpty = false\n\n if (Array.isArray(received) || typeof received === 'string') {\n isEmpty = received.length === 0\n } else if (received && typeof received === 'object') {\n isEmpty = Object.keys(received).length === 0\n } else if (received instanceof Map || received instanceof Set) {\n isEmpty = received.size === 0\n } else {\n return {\n pass: false,\n message: () =>\n `Expected value to be an empty array, string, object, Map, or Set, but received ${typeof received}.`,\n }\n }\n\n return isEmpty\n ? {\n pass: true,\n message: () =>\n 'Expected value not to be empty, but it was.',\n }\n : {\n pass: false,\n message: () =>\n 'Expected value to be empty, but it was not.',\n }\n },\n /**\n * Asserts the received value is a valid Date instance (not an invalid date).\n * @param received - The value to check.\n */\n toBeValidDate(\n received: unknown,\n ) {\n const isValid\n = received instanceof Date && !Number.isNaN(received.getTime())\n\n return {\n pass: isValid,\n message: () =>\n isValid\n ? `expected ${received} not to be a valid Date`\n : `expected ${received} to be a valid Date`,\n }\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/** Result returned by a custom matcher function. */\nexport interface ExpectationResult {\n /** The actual value received by the matcher. */\n actual?: unknown\n /** The expected value the matcher compared against. */\n expected?: unknown\n /** Returns a human-readable failure or negation message. */\n message: () => string\n /** Whether the matcher assertion passed. */\n pass: boolean\n}\n\nconst formatValue = (value: unknown): string => {\n if (typeof value === 'string') return value\n if (typeof value === 'number' && !Number.isFinite(value)) return String(value)\n const json = JSON.stringify(value)\n return json ?? String(value)\n}\n\n/**\n * Checks whether the received value matches the expected JavaScript type and is not NaN.\n * @param received - The value to check.\n * @param expectedType - The expected `typeof` string (e.g. 'number', 'string').\n * @returns An ExpectationResult indicating pass or fail.\n */\nfunction toBeType(received: unknown, expectedType: string): ExpectationResult {\n const pass = typeof received === expectedType && !Number.isNaN(received)\n return pass\n ? {\n message: () => `expected ${formatValue(received)} not to be a ${expectedType}`,\n pass: true,\n }\n : {\n message: () => `expected ${formatValue(received)} to be a ${expectedType}`,\n pass: false,\n }\n}\n\n/** Collection of custom Vitest matchers extending the built-in `expect` assertions. */\nexport const matchers = {\n /**\n * Asserts the received value is an array with the specified length.\n * @param received - The value to check.\n * @param expectedSize - The expected array length.\n */\n toBeArrayOfSize(received: unknown, expectedSize: number): ExpectationResult {\n const pass = Array.isArray(received) && received.length === expectedSize\n return pass\n ? {\n message: () => `expected array not to have size ${expectedSize}, but received array of size ${received.length}`,\n pass: true,\n }\n : {\n message: () => Array.isArray(received)\n ? `expected array of size ${expectedSize}, but received array of size ${received.length}`\n : `expected array of size ${expectedSize}, but received a non-array`,\n pass: false,\n }\n },\n /**\n * Asserts the received value is an array.\n * @param received - The value to check.\n */\n toBeArray(received: unknown): ExpectationResult {\n const pass = Array.isArray(received)\n return pass\n ? {\n message: () => 'expected array',\n pass: true,\n }\n : {\n message: () => `expected array, but received ${typeof received}`,\n pass: false,\n }\n },\n /**\n * Asserts the received value is one of the values in the expected array.\n * @param received - The value to check.\n * @param expected - The array of acceptable values.\n */\n toBeOneOf(received: unknown, expected: unknown[]): ExpectationResult {\n const pass = expected.includes(received)\n return pass\n ? {\n pass: true,\n message: () =>\n `expected ${formatValue(received)} not to be one of ${JSON.stringify(expected)}`,\n }\n : {\n pass: false,\n message: () =>\n `expected ${formatValue(received)} to be one of ${JSON.stringify(expected)}`,\n }\n },\n /**\n * Asserts the received number is negative (less than zero).\n * @param received - The number to check.\n */\n toBeNegative(received: number): ExpectationResult {\n if (typeof received !== 'number') {\n throw new TypeError(`Expected a number, but received ${typeof received}`)\n }\n\n const pass = received < 0\n return pass\n ? {\n pass: true,\n message: () =>\n `expected ${received} not to be negative`,\n }\n : {\n pass: false,\n message: () =>\n `expected ${received} to be negative`,\n }\n },\n /**\n * Asserts the received number is positive (greater than zero).\n * @param received - The number to check.\n */\n toBePositive(received: number): ExpectationResult {\n if (typeof received !== 'number') {\n throw new TypeError(`Expected a number, but received ${typeof received}`)\n }\n\n const pass = received > 0\n return pass\n ? {\n pass: true,\n message: () =>\n `expected ${received} not to be positive`,\n }\n : {\n pass: false,\n message: () =>\n `expected ${received} to be positive`,\n }\n },\n /**\n * Asserts the received value is of type `number` and not NaN.\n * @param received - The value to check.\n */\n toBeNumber: (received: unknown) => toBeType(received, 'number'),\n /**\n * Asserts the received value is of type `function`.\n * @param received - The value to check.\n */\n toBeFunction: (received: unknown) => toBeType(received, 'function'),\n /**\n * Asserts the received value is of type `string`.\n * @param received - The value to check.\n */\n toBeString: (received: unknown) => toBeType(received, 'string'),\n /**\n * Asserts the received value is a plain object (not an array or null).\n * @param received - The value to check.\n */\n toBeObject(received: unknown): ExpectationResult {\n const pass = typeof received === 'object' && !Array.isArray(received) && received !== null\n return pass\n ? {\n message: () => `expected ${formatValue(received)} to be object`,\n pass: true,\n }\n : {\n message: () => `expected ${formatValue(received)} to be an object but was ${Array.isArray(received) ? 'array' : typeof received}`,\n pass: false,\n }\n },\n /**\n * Asserts the received number is an integer.\n * @param received - The number to check.\n */\n toBeInteger(received: number): ExpectationResult {\n if (typeof received !== 'number') {\n throw new TypeError(`Expected a number, but received ${typeof received}`)\n }\n\n const pass = Number.isInteger(received)\n return pass\n ? {\n pass: true,\n message: () =>\n `expected ${received} not to be an integer`,\n }\n : {\n pass: false,\n message: () =>\n `expected ${received} to be an integer`,\n }\n },\n /**\n * Asserts the received value is strictly `false`.\n * @param received - The value to check.\n */\n toBeFalse(received: unknown): ExpectationResult {\n const pass = received === false\n return pass\n ? {\n message: () => `expected ${formatValue(received)} to be false`,\n pass: true,\n }\n : {\n message: () => `expected ${formatValue(received)} to be false but was not false`,\n pass: false,\n }\n },\n /**\n * Asserts the received value is strictly `true`.\n * @param received - The value to check.\n */\n toBeTrue(received: unknown): ExpectationResult {\n const pass = received === true\n return pass\n ? {\n message: () => `expected ${formatValue(received)} to be true`,\n pass: true,\n }\n : {\n message: () => `expected ${formatValue(received)} to be true but was not true`,\n pass: false,\n }\n },\n /**\n * Asserts that all expected values are present in the received array or object values.\n * @param received - The array or object to check.\n * @param expectedValues - The values that must all be present.\n */\n toContainAllValues(received: unknown, expectedValues: unknown[]) {\n let receivedValues: unknown[]\n\n // Check if received is an array or an object\n if (Array.isArray(received)) {\n receivedValues = received\n } else if (typeof received === 'object' && received !== null) {\n receivedValues = Object.values(received)\n } else {\n return {\n pass: false,\n message: () => `Expected an array or object, but received ${typeof received}.`,\n }\n }\n\n // Check if all expected values are in the received values\n const pass = expectedValues.every(value => receivedValues.includes(value))\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected ${JSON.stringify(received)} not to contain all values ${JSON.stringify(expectedValues)}, but it does.`\n : `Expected ${JSON.stringify(received)} to contain all values ${JSON.stringify(expectedValues)}, but it does not.`,\n }\n },\n /**\n * Asserts that the received object contains the specified key.\n * @param received - The object to check.\n * @param key - The key that should be present.\n */\n toContainKey(received: object, key: string) {\n const pass = Object.prototype.hasOwnProperty.call(received, key)\n return pass\n ? {\n pass: true,\n message: () => `Expected object not to contain key \"${key}\", but it does.`,\n }\n : {\n pass: false,\n message: () => `Expected object to contain key \"${key}\", but it does not.`,\n }\n },\n /**\n * Asserts that the received array, string, or object values include the specified value.\n * @param received - The array, string, or object to search within.\n * @param value - The value to look for.\n */\n toInclude(received: unknown, value: unknown) {\n let pass: boolean\n\n if (Array.isArray(received)) {\n pass = received.includes(value)\n } else if (typeof received === 'string') {\n pass = received.includes(String(value))\n } else if (typeof received === 'object' && received !== null) {\n pass = Object.values(received).includes(value)\n } else {\n pass = false\n }\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected ${JSON.stringify(received)} not to include ${JSON.stringify(value)}, but it does.`\n : `Expected ${JSON.stringify(received)} to include ${JSON.stringify(value)}, but it does not.`,\n }\n },\n /**\n * Asserts that the received array includes all members of the expected array.\n * @param received - The array to check.\n * @param expected - The members that must all be present.\n */\n toIncludeAllMembers(received: unknown[], expected: unknown[]): ExpectationResult {\n if (!Array.isArray(received) || !Array.isArray(expected)) {\n return {\n pass: false,\n message: () => 'Expected both received and expected values to be arrays.',\n }\n }\n\n const missingMembers = expected.filter(item => !received.includes(item))\n\n return missingMembers.length === 0\n ? {\n pass: true,\n message: () =>\n `Expected array not to include all members of ${JSON.stringify(expected)}, but it does.`,\n }\n : {\n pass: false,\n message: () =>\n `Expected array to include all members of ${JSON.stringify(expected)}. Missing members: ${JSON.stringify(\n missingMembers,\n )}.`,\n }\n },\n /**\n * Asserts that the received object contains all of the specified keys.\n * @param received - The object to check.\n * @param expectedKeys - The keys that must all be present.\n */\n toContainAllKeys(received: object, expectedKeys: string[]): ExpectationResult {\n if (typeof received !== 'object' || received === null) {\n return {\n pass: false,\n message: () => `Expected ${JSON.stringify(received)} to be an object.`,\n }\n }\n\n if (!Array.isArray(expectedKeys)) {\n return {\n pass: false,\n message: () => `Expected keys to be an array, but received ${JSON.stringify(expectedKeys)}.`,\n }\n }\n\n const missingKeys = expectedKeys.filter(key => !(key in received))\n\n return missingKeys.length === 0\n ? {\n pass: true,\n message: () =>\n `Expected object not to contain all keys ${JSON.stringify(expectedKeys)}, but it does.`,\n }\n : {\n pass: false,\n message: () =>\n `Expected object to contain all keys ${JSON.stringify(expectedKeys)}. Missing keys: ${JSON.stringify(\n missingKeys,\n )}.`,\n }\n },\n /**\n * Asserts that the received object contains all of the specified values (using deep equality).\n * @param received - The object to check.\n * @param expectedValues - The values that must all be present.\n */\n toContainValues(received: object, expectedValues: unknown[]): ExpectationResult {\n if (typeof received !== 'object' || received === null) {\n return {\n pass: false,\n message: () => `Expected ${JSON.stringify(received)} to be an object.`,\n }\n }\n\n if (!Array.isArray(expectedValues)) {\n return {\n pass: false,\n message: () => `Expected values to be an array, but received ${JSON.stringify(expectedValues)}.`,\n }\n }\n\n const objectValues = Object.values(received)\n\n const deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true\n if (typeof a !== typeof b) return false\n if (a !== null && b !== null && typeof a === 'object' && typeof b === 'object') {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) return false\n const aRecord = a as Record<string, unknown>\n const bRecord = b as Record<string, unknown>\n return aKeys.every(key => deepEqual(aRecord[key], bRecord[key]))\n }\n return false\n }\n\n const missingValues = expectedValues.filter(\n expectedValue => !objectValues.some(value => deepEqual(value, expectedValue)),\n )\n\n return missingValues.length === 0\n ? {\n pass: true,\n message: () =>\n `Expected object not to contain all values ${JSON.stringify(expectedValues)}, but it does.`,\n }\n : {\n pass: false,\n message: () =>\n `Expected object to contain all values ${JSON.stringify(expectedValues)}. Missing values: ${JSON.stringify(\n missingValues,\n )}.`,\n }\n },\n /**\n * Asserts the received value is empty (zero-length array/string, empty object, or empty Map/Set).\n * @param received - The value to check.\n */\n toBeEmpty(received: unknown): ExpectationResult {\n const isEmpty = (() => {\n if (Array.isArray(received) || typeof received === 'string') {\n return received.length === 0\n }\n if (received !== null && typeof received === 'object') {\n return Object.keys(received).length === 0\n }\n })()\n\n if (isEmpty === undefined) {\n return {\n pass: false,\n message: () =>\n `Expected value to be an empty array, string, object, Map, or Set, but received ${typeof received}.`,\n }\n }\n\n return isEmpty\n ? {\n pass: true,\n message: () =>\n 'Expected value not to be empty, but it was.',\n }\n : {\n pass: false,\n message: () =>\n 'Expected value to be empty, but it was not.',\n }\n },\n /**\n * Asserts the received value is a valid Date instance (not an invalid date).\n * @param received - The value to check.\n */\n toBeValidDate(\n received: unknown,\n ) {\n const isValid\n = received instanceof Date && !Number.isNaN(received.getTime())\n\n return {\n pass: isValid,\n message: () =>\n isValid\n ? `expected ${received.toISOString()} not to be a valid Date`\n : `expected ${formatValue(received)} to be a valid Date`,\n }\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/vitest-matchers",
3
- "version": "6.0.2",
3
+ "version": "6.0.3",
4
4
  "description": "Base functionality used throughout XY Labs TypeScript/JavaScript libraries",
5
5
  "keywords": [
6
6
  "log",
@@ -47,11 +47,11 @@
47
47
  "README.md"
48
48
  ],
49
49
  "devDependencies": {
50
- "@xylabs/toolchain": "^8.1.1",
51
- "@xylabs/tsconfig": "^8.1.1",
50
+ "@xylabs/toolchain": "^8.1.4",
51
+ "@xylabs/tsconfig": "^8.1.4",
52
52
  "eslint": "^10.4.0",
53
53
  "typescript": "^6.0.3",
54
- "vite": "^8.0.13",
54
+ "vite": "^8.0.14",
55
55
  "vitest": "^4.1.7"
56
56
  },
57
57
  "engines": {