@xylabs/vitest-matchers 4.4.20 → 4.4.21

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.
@@ -17,10 +17,18 @@ export declare const matchers: {
17
17
  toBeInteger(received: number): ExpectationResult;
18
18
  toBeFalse(received: unknown): ExpectationResult;
19
19
  toBeTrue(received: unknown): ExpectationResult;
20
+ toContainAllValues(received: unknown, expectedValues: unknown[]): {
21
+ pass: boolean;
22
+ message: () => string;
23
+ };
20
24
  toContainKey(received: object, key: string): {
21
25
  pass: boolean;
22
26
  message: () => string;
23
27
  };
28
+ toInclude(received: unknown, value: any): {
29
+ pass: boolean;
30
+ message: () => string;
31
+ };
24
32
  toIncludeAllMembers(received: unknown[], expected: unknown[]): ExpectationResult;
25
33
  toContainAllKeys(received: object, expectedKeys: string[]): ExpectationResult;
26
34
  toContainValues(received: object, expectedValues: unknown[]): ExpectationResult;
@@ -1 +1 @@
1
- {"version":3,"file":"customMatchers.d.ts","sourceRoot":"","sources":["../../src/customMatchers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,IAAI,EAAE,OAAO,CAAA;CACd;AAeD,eAAO,MAAM,QAAQ;8BACO,OAAO,gBAAgB,MAAM,GAAG,iBAAiB;wBAcvD,OAAO,GAAG,iBAAiB;wBAY3B,OAAO,YAAY,OAAO,EAAE,GAAG,iBAAiB;2BAc7C,MAAM,GAAG,iBAAiB;2BAkB1B,MAAM,GAAG,iBAAiB;2BAkB1B,OAAO;6BACL,OAAO;2BACT,OAAO;yBACT,OAAO,GAAG,iBAAiB;0BAY1B,MAAM,GAAG,iBAAiB;wBAkB5B,OAAO,GAAG,iBAAiB;uBAY5B,OAAO,GAAG,iBAAiB;2BAYvB,MAAM,OAAO,MAAM;;;;kCAYZ,OAAO,EAAE,YAAY,OAAO,EAAE,GAAG,iBAAiB;+BAwBrD,MAAM,gBAAgB,MAAM,EAAE,GAAG,iBAAiB;8BA+BnD,MAAM,kBAAkB,OAAO,EAAE,GAAG,iBAAiB;wBAgD3D,OAAO,GAAG,iBAAiB;CA6BhD,CAAA"}
1
+ {"version":3,"file":"customMatchers.d.ts","sourceRoot":"","sources":["../../src/customMatchers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,IAAI,EAAE,OAAO,CAAA;CACd;AAeD,eAAO,MAAM,QAAQ;8BACO,OAAO,gBAAgB,MAAM,GAAG,iBAAiB;wBAcvD,OAAO,GAAG,iBAAiB;wBAY3B,OAAO,YAAY,OAAO,EAAE,GAAG,iBAAiB;2BAc7C,MAAM,GAAG,iBAAiB;2BAkB1B,MAAM,GAAG,iBAAiB;2BAkB1B,OAAO;6BACL,OAAO;2BACT,OAAO;yBACT,OAAO,GAAG,iBAAiB;0BAY1B,MAAM,GAAG,iBAAiB;wBAkB5B,OAAO,GAAG,iBAAiB;uBAY5B,OAAO,GAAG,iBAAiB;iCAYjB,OAAO,kBAAkB,OAAO,EAAE;;;;2BA0BxC,MAAM,OAAO,MAAM;;;;wBAatB,OAAO,SAAS,GAAG;;;;kCAqBT,OAAO,EAAE,YAAY,OAAO,EAAE,GAAG,iBAAiB;+BAwBrD,MAAM,gBAAgB,MAAM,EAAE,GAAG,iBAAiB;8BA+BnD,MAAM,kBAAkB,OAAO,EAAE,GAAG,iBAAiB;wBAgD3D,OAAO,GAAG,iBAAiB;CA6BhD,CAAA"}
@@ -112,6 +112,24 @@ var matchers = {
112
112
  pass: false
113
113
  };
114
114
  },
115
+ toContainAllValues(received, expectedValues) {
116
+ let receivedValues;
117
+ if (Array.isArray(received)) {
118
+ receivedValues = received;
119
+ } else if (typeof received === "object" && received !== null) {
120
+ receivedValues = Object.values(received);
121
+ } else {
122
+ return {
123
+ pass: false,
124
+ message: () => `Expected an array or object, but received ${typeof received}.`
125
+ };
126
+ }
127
+ const pass = expectedValues.every((value) => receivedValues.includes(value));
128
+ return {
129
+ pass,
130
+ message: () => pass ? `Expected ${JSON.stringify(received)} not to contain all values ${JSON.stringify(expectedValues)}, but it does.` : `Expected ${JSON.stringify(received)} to contain all values ${JSON.stringify(expectedValues)}, but it does not.`
131
+ };
132
+ },
115
133
  toContainKey(received, key) {
116
134
  const pass = Object.prototype.hasOwnProperty.call(received, key);
117
135
  return pass ? {
@@ -122,6 +140,23 @@ var matchers = {
122
140
  message: () => `Expected object to contain key "${key}", but it does not.`
123
141
  };
124
142
  },
143
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
144
+ toInclude(received, value) {
145
+ let pass;
146
+ if (Array.isArray(received)) {
147
+ pass = received.includes(value);
148
+ } else if (typeof received === "string") {
149
+ pass = received.includes(value);
150
+ } else if (typeof received === "object" && received !== null) {
151
+ pass = Object.values(received).includes(value);
152
+ } else {
153
+ pass = false;
154
+ }
155
+ return {
156
+ pass,
157
+ message: () => pass ? `Expected ${JSON.stringify(received)} not to include ${JSON.stringify(value)}, but it does.` : `Expected ${JSON.stringify(received)} to include ${JSON.stringify(value)}, but it does not.`
158
+ };
159
+ },
125
160
  toIncludeAllMembers(received, expected) {
126
161
  if (!Array.isArray(received) || !Array.isArray(expected)) {
127
162
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/customMatchers.ts"],"sourcesContent":["export interface ExpectationResult {\n actual?: unknown\n expected?: unknown\n message: () => string\n pass: boolean\n}\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\nexport const matchers = {\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 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 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 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 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 toBeNumber: (received: unknown) => toBeType(received, 'number'),\n toBeFunction: (received: unknown) => toBeType(received, 'function'),\n toBeString: (received: unknown) => toBeType(received, 'string'),\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 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 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 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 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 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 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 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 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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/customMatchers.ts"],"sourcesContent":["export interface ExpectationResult {\n actual?: unknown\n expected?: unknown\n message: () => string\n pass: boolean\n}\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\nexport const matchers = {\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 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 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 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 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 toBeNumber: (received: unknown) => toBeType(received, 'number'),\n toBeFunction: (received: unknown) => toBeType(received, 'function'),\n toBeString: (received: unknown) => toBeType(received, 'string'),\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 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 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 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 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 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 // 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 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 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 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 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"],"mappings":";AAOA,SAAS,SAAS,UAAmB,cAAyC;AAC5E,QAAM,OAAO,OAAO,aAAa,gBAAgB,CAAC,OAAO,MAAM,QAAQ;AACvE,SAAO,OACH;AAAA,IACE,SAAS,MAAM,YAAY,QAAQ,gBAAgB,YAAY;AAAA,IAC/D,MAAM;AAAA,EACR,IACA;AAAA,IACE,SAAS,MAAM,YAAY,QAAQ,YAAY,YAAY;AAAA,IAC3D,MAAM;AAAA,EACR;AACN;AAEO,IAAM,WAAW;AAAA,EACtB,gBAAgB,UAAmB,cAAyC;AAC1E,UAAM,OAAO,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW;AAC5D,WAAO,OACH;AAAA,MACE,SAAS,MAAM,mCAAmC,YAAY,gCAAgC,SAAS,MAAM;AAAA,MAC7G,MAAM;AAAA,IACR,IACA;AAAA,MACE,SAAS,MAAM,MAAM,QAAQ,QAAQ,IACjC,0BAA0B,YAAY,gCAAgC,SAAS,MAAM,KACrF,0BAA0B,YAAY;AAAA,MAC1C,MAAM;AAAA,IACR;AAAA,EACN;AAAA,EACA,UAAU,UAAsC;AAC9C,UAAM,OAAO,MAAM,QAAQ,QAAQ;AACnC,WAAO,OACH;AAAA,MACE,SAAS,MAAM;AAAA,MACf,MAAM;AAAA,IACR,IACA;AAAA,MACE,SAAS,MAAM,gCAAgC,OAAO,QAAQ;AAAA,MAC9D,MAAM;AAAA,IACR;AAAA,EACN;AAAA,EACA,UAAU,UAAmB,UAAwC;AACnE,UAAM,OAAO,SAAS,SAAS,QAAQ;AACvC,WAAO,OACH;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,YAAY,QAAQ,qBAAqB,KAAK,UAAU,QAAQ,CAAC;AAAA,IACrE,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,YAAY,QAAQ,iBAAiB,KAAK,UAAU,QAAQ,CAAC;AAAA,IACjE;AAAA,EACN;AAAA,EACA,aAAa,UAAqC;AAChD,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,IAAI,UAAU,mCAAmC,OAAO,QAAQ,EAAE;AAAA,IAC1E;AAEA,UAAM,OAAO,WAAW;AACxB,WAAO,OACH;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,YAAY,QAAQ;AAAA,IACxB,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,YAAY,QAAQ;AAAA,IACxB;AAAA,EACN;AAAA,EACA,aAAa,UAAqC;AAChD,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,IAAI,UAAU,mCAAmC,OAAO,QAAQ,EAAE;AAAA,IAC1E;AAEA,UAAM,OAAO,WAAW;AACxB,WAAO,OACH;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,YAAY,QAAQ;AAAA,IACxB,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,YAAY,QAAQ;AAAA,IACxB;AAAA,EACN;AAAA,EACA,YAAY,CAAC,aAAsB,SAAS,UAAU,QAAQ;AAAA,EAC9D,cAAc,CAAC,aAAsB,SAAS,UAAU,UAAU;AAAA,EAClE,YAAY,CAAC,aAAsB,SAAS,UAAU,QAAQ;AAAA,EAC9D,WAAW,UAAsC;AAC/C,UAAM,OAAO,OAAO,aAAa,YAAY,CAAC,MAAM,QAAQ,QAAQ,KAAK,aAAa;AACtF,WAAO,OACH;AAAA,MACE,SAAS,MAAM,YAAY,QAAQ;AAAA,MACnC,MAAM;AAAA,IACR,IACA;AAAA,MACE,SAAS,MAAM,YAAY,QAAQ,4BAA4B,MAAM,QAAQ,QAAQ,IAAI,UAAU,OAAO,QAAQ;AAAA,MAClH,MAAM;AAAA,IACR;AAAA,EACN;AAAA,EACA,YAAY,UAAqC;AAC/C,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,IAAI,UAAU,mCAAmC,OAAO,QAAQ,EAAE;AAAA,IAC1E;AAEA,UAAM,OAAO,OAAO,UAAU,QAAQ;AACtC,WAAO,OACH;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,YAAY,QAAQ;AAAA,IACxB,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,YAAY,QAAQ;AAAA,IACxB;AAAA,EACN;AAAA,EACA,UAAU,UAAsC;AAC9C,UAAM,OAAO,aAAa;AAC1B,WAAO,OACH;AAAA,MACE,SAAS,MAAM,YAAY,QAAQ;AAAA,MACnC,MAAM;AAAA,IACR,IACA;AAAA,MACE,SAAS,MAAM,YAAY,QAAQ;AAAA,MACnC,MAAM;AAAA,IACR;AAAA,EACN;AAAA,EACA,SAAS,UAAsC;AAC7C,UAAM,OAAO,aAAa;AAC1B,WAAO,OACH;AAAA,MACE,SAAS,MAAM,YAAY,QAAQ;AAAA,MACnC,MAAM;AAAA,IACR,IACA;AAAA,MACE,SAAS,MAAM,YAAY,QAAQ;AAAA,MACnC,MAAM;AAAA,IACR;AAAA,EACN;AAAA,EACA,mBAAmB,UAAmB,gBAA2B;AAC/D,QAAI;AAGJ,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,uBAAiB;AAAA,IACnB,WAAW,OAAO,aAAa,YAAY,aAAa,MAAM;AAC5D,uBAAiB,OAAO,OAAO,QAAQ;AAAA,IACzC,OAAO;AACL,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM,6CAA6C,OAAO,QAAQ;AAAA,MAC7E;AAAA,IACF;AAGA,UAAM,OAAO,eAAe,MAAM,WAAS,eAAe,SAAS,KAAK,CAAC;AAEzE,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MACP,OACI,YAAY,KAAK,UAAU,QAAQ,CAAC,8BAA8B,KAAK,UAAU,cAAc,CAAC,mBAChG,YAAY,KAAK,UAAU,QAAQ,CAAC,0BAA0B,KAAK,UAAU,cAAc,CAAC;AAAA,IACpG;AAAA,EACF;AAAA,EACA,aAAa,UAAkB,KAAa;AAC1C,UAAM,OAAO,OAAO,UAAU,eAAe,KAAK,UAAU,GAAG;AAC/D,WAAO,OACH;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MAAM,uCAAuC,GAAG;AAAA,IAC3D,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MAAM,mCAAmC,GAAG;AAAA,IACvD;AAAA,EACN;AAAA;AAAA,EAEA,UAAU,UAAmB,OAAY;AACvC,QAAI;AAEJ,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,aAAO,SAAS,SAAS,KAAK;AAAA,IAChC,WAAW,OAAO,aAAa,UAAU;AACvC,aAAO,SAAS,SAAS,KAAK;AAAA,IAChC,WAAW,OAAO,aAAa,YAAY,aAAa,MAAM;AAC5D,aAAO,OAAO,OAAO,QAAQ,EAAE,SAAS,KAAK;AAAA,IAC/C,OAAO;AACL,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MACP,OACI,YAAY,KAAK,UAAU,QAAQ,CAAC,mBAAmB,KAAK,UAAU,KAAK,CAAC,mBAC5E,YAAY,KAAK,UAAU,QAAQ,CAAC,eAAe,KAAK,UAAU,KAAK,CAAC;AAAA,IAChF;AAAA,EACF;AAAA,EACA,oBAAoB,UAAqB,UAAwC;AAC/E,QAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,QAAQ,QAAQ,GAAG;AACxD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,iBAAiB,SAAS,OAAO,UAAQ,CAAC,SAAS,SAAS,IAAI,CAAC;AAEvE,WAAO,eAAe,WAAW,IAC7B;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,gDAAgD,KAAK,UAAU,QAAQ,CAAC;AAAA,IAC5E,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,4CAA4C,KAAK,UAAU,QAAQ,CAAC,sBAAsB,KAAK;AAAA,QAC7F;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACN;AAAA,EACA,iBAAiB,UAAkB,cAA2C;AAC5E,QAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM,YAAY,KAAK,UAAU,QAAQ,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,QAAQ,YAAY,GAAG;AAChC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM,8CAA8C,KAAK,UAAU,YAAY,CAAC;AAAA,MAC3F;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,OAAO,SAAO,EAAE,OAAO,SAAS;AAEjE,WAAO,YAAY,WAAW,IAC1B;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,2CAA2C,KAAK,UAAU,YAAY,CAAC;AAAA,IAC3E,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,uCAAuC,KAAK,UAAU,YAAY,CAAC,mBAAmB,KAAK;AAAA,QACzF;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACN;AAAA,EACA,gBAAgB,UAAkB,gBAA8C;AAC9E,QAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM,YAAY,KAAK,UAAU,QAAQ,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,QAAQ,cAAc,GAAG;AAClC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM,gDAAgD,KAAK,UAAU,cAAc,CAAC;AAAA,MAC/F;AAAA,IACF;AAEA,UAAM,eAAe,OAAO,OAAO,QAAQ;AAG3C,UAAM,YAAY,CAAC,GAAQ,MAAoB;AAC7C,UAAI,MAAM,EAAG,QAAO;AACpB,UAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,UAAI,KAAK,KAAK,OAAO,MAAM,UAAU;AACnC,cAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,cAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,YAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,eAAO,MAAM,MAAM,SAAO,UAAU,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;AAAA,MACrD;AACA,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,eAAe;AAAA,MACnC,mBAAiB,CAAC,aAAa,KAAK,WAAS,UAAU,OAAO,aAAa,CAAC;AAAA,IAC9E;AAEA,WAAO,cAAc,WAAW,IAC5B;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,6CAA6C,KAAK,UAAU,cAAc,CAAC;AAAA,IAC/E,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP,yCAAyC,KAAK,UAAU,cAAc,CAAC,qBAAqB,KAAK;AAAA,QAC/F;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACN;AAAA,EACA,UAAU,UAAsC;AAC9C,QAAI,UAAU;AAEd,QAAI,MAAM,QAAQ,QAAQ,KAAK,OAAO,aAAa,UAAU;AAC3D,gBAAU,SAAS,WAAW;AAAA,IAChC,WAAW,YAAY,OAAO,aAAa,UAAU;AACnD,gBAAU,OAAO,KAAK,QAAQ,EAAE,WAAW;AAAA,IAC7C,WAAW,oBAAoB,OAAO,oBAAoB,KAAK;AAC7D,gBAAU,SAAS,SAAS;AAAA,IAC9B,OAAO;AACL,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MACP,kFAAkF,OAAO,QAAQ;AAAA,MACrG;AAAA,IACF;AAEA,WAAO,UACH;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP;AAAA,IACJ,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,MACP;AAAA,IACJ;AAAA,EACN;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/vitest-matchers",
3
- "version": "4.4.20",
3
+ "version": "4.4.21",
4
4
  "description": "Base functionality used throughout XY Labs TypeScript/JavaScript libraries",
5
5
  "keywords": [
6
6
  "log",
@@ -152,6 +152,32 @@ export const matchers = {
152
152
  pass: false,
153
153
  }
154
154
  },
155
+ toContainAllValues(received: unknown, expectedValues: unknown[]) {
156
+ let receivedValues: unknown[]
157
+
158
+ // Check if received is an array or an object
159
+ if (Array.isArray(received)) {
160
+ receivedValues = received
161
+ } else if (typeof received === 'object' && received !== null) {
162
+ receivedValues = Object.values(received)
163
+ } else {
164
+ return {
165
+ pass: false,
166
+ message: () => `Expected an array or object, but received ${typeof received}.`,
167
+ }
168
+ }
169
+
170
+ // Check if all expected values are in the received values
171
+ const pass = expectedValues.every(value => receivedValues.includes(value))
172
+
173
+ return {
174
+ pass,
175
+ message: () =>
176
+ pass
177
+ ? `Expected ${JSON.stringify(received)} not to contain all values ${JSON.stringify(expectedValues)}, but it does.`
178
+ : `Expected ${JSON.stringify(received)} to contain all values ${JSON.stringify(expectedValues)}, but it does not.`,
179
+ }
180
+ },
155
181
  toContainKey(received: object, key: string) {
156
182
  const pass = Object.prototype.hasOwnProperty.call(received, key)
157
183
  return pass
@@ -164,6 +190,28 @@ export const matchers = {
164
190
  message: () => `Expected object to contain key "${key}", but it does not.`,
165
191
  }
166
192
  },
193
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
194
+ toInclude(received: unknown, value: any) {
195
+ let pass: boolean
196
+
197
+ if (Array.isArray(received)) {
198
+ pass = received.includes(value)
199
+ } else if (typeof received === 'string') {
200
+ pass = received.includes(value)
201
+ } else if (typeof received === 'object' && received !== null) {
202
+ pass = Object.values(received).includes(value)
203
+ } else {
204
+ pass = false
205
+ }
206
+
207
+ return {
208
+ pass,
209
+ message: () =>
210
+ pass
211
+ ? `Expected ${JSON.stringify(received)} not to include ${JSON.stringify(value)}, but it does.`
212
+ : `Expected ${JSON.stringify(received)} to include ${JSON.stringify(value)}, but it does not.`,
213
+ }
214
+ },
167
215
  toIncludeAllMembers(received: unknown[], expected: unknown[]): ExpectationResult {
168
216
  if (!Array.isArray(received) || !Array.isArray(expected)) {
169
217
  return {