quidproquo-testing 0.1.3 → 0.1.5

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.
@@ -86,3 +86,4 @@ function mockGeneratorYieldReturn(yieldValue, returnValue) {
86
86
  return returnValue;
87
87
  })();
88
88
  }
89
+ //# sourceMappingURL=generatorExpect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatorExpect.js","sourceRoot":"","sources":["../../src/generatorExpect.ts"],"names":[],"mappings":"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","sourcesContent":["interface GeneratorStep {\n type: 'yield' | 'return';\n value: any;\n input?: any;\n}\n\nexport class GeneratorExpectChain<T = any> {\n private steps: GeneratorStep[] = [];\n private lastInput: any;\n private expect: any;\n\n constructor(\n private generator: Generator<any, any, any>,\n expect?: any,\n ) {\n // Use global expect if available, otherwise use provided expect\n this.expect = expect || (globalThis as any).expect;\n if (!this.expect) {\n throw new Error('expect function not found. Please ensure Vitest or another test framework is available.');\n }\n }\n\n toYield(expected: any): this {\n const { value, done } = this.generator.next();\n this.expect(done).toBe(false);\n this.expect(value).toEqual(expected);\n this.steps.push({ type: 'yield', value });\n return this;\n }\n\n toYieldAction(expected: any): this {\n return this.toYield(expected);\n }\n\n // Multiple name options for clarity in different contexts\n whenGiven(input: any): this {\n this.lastInput = input;\n return this;\n }\n\n andReceive(input: any): this {\n return this.whenGiven(input);\n }\n\n withResponse(input: any): this {\n return this.whenGiven(input);\n }\n\n thenYield(expected: any): this {\n const { value, done } = this.generator.next(this.lastInput);\n this.expect(done).toBe(false);\n this.expect(value).toEqual(expected);\n this.steps.push({ type: 'yield', value, input: this.lastInput });\n this.lastInput = undefined;\n return this;\n }\n\n thenReturn(expected: any): void {\n const { value, done } = this.generator.next(this.lastInput);\n this.expect(done).toBe(true);\n this.expect(value).toStrictEqual(expected);\n this.steps.push({ type: 'return', value, input: this.lastInput });\n }\n\n // Alternative terminator that doesn't check the return value\n thenComplete(): void {\n const { done } = this.generator.next(this.lastInput);\n this.expect(done).toBe(true);\n }\n\n // For debugging - returns current execution steps\n getSteps(): GeneratorStep[] {\n return [...this.steps];\n }\n\n // Snapshot support for recording generator behavior\n toMatchSnapshot(name?: string): void {\n this.expect(this.steps).toMatchSnapshot(name);\n }\n}\n\nexport function expectGenerator<T>(gen: Generator<any, T, any>, expect?: any): GeneratorExpectChain<T> {\n return new GeneratorExpectChain(gen, expect);\n}\n\n/**\n * Helper to create a generator that returns immediately without yielding\n * Useful for mocking sub-generators in tests\n */\nexport function mockGeneratorReturn<T>(value: T): Generator<any, T, any> {\n return (function* () {\n return value;\n })();\n}\n\n/**\n * Helper to create a generator that yields once then returns\n * Useful for mocking sub-generators that need to yield an action\n */\nexport function mockGeneratorYieldReturn<Y, R>(yieldValue: Y, returnValue: R): Generator<Y, R, any> {\n return (function* () {\n yield yieldValue;\n return returnValue;\n })();\n}\n"]}
@@ -22,3 +22,4 @@ __exportStar(require("./types"), exports);
22
22
  // Export vitestMatchers for explicit import by Vitest users
23
23
  // Users should import this explicitly: import 'quidproquo-testing/vitest'
24
24
  // We don't auto-import since not all users may be using Vitest
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qDAA0E;AAAjE,kHAAA,eAAe,OAAA;AAAE,uHAAA,oBAAoB,OAAA;AAC9C,0CAAwB;AAExB,4DAA4D;AAC5D,0EAA0E;AAC1E,+DAA+D","sourcesContent":["export { expectGenerator, GeneratorExpectChain } from './generatorExpect';\nexport * from './types';\n\n// Export vitestMatchers for explicit import by Vitest users\n// Users should import this explicitly: import 'quidproquo-testing/vitest'\n// We don't auto-import since not all users may be using Vitest\n"]}
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["// Test utility types\nexport interface GeneratorTestStep<T = any> {\n yields?: T;\n given?: any;\n returns?: any;\n}\n\nexport type GeneratorTestSequence<T = any> = GeneratorTestStep<T>[];\n"]}
@@ -18,3 +18,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  // Import this in your test setup: import 'quidproquo-testing/vitest'
19
19
  require("./vitestMatchers");
20
20
  __exportStar(require("./index"), exports);
21
+ //# sourceMappingURL=vitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/vitest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAA2D;AAC3D,qEAAqE;AACrE,4BAA0B;AAE1B,0CAAwB","sourcesContent":["// Entry point for Vitest users to register custom matchers\n// Import this in your test setup: import 'quidproquo-testing/vitest'\nimport './vitestMatchers';\n\nexport * from './index';\n"]}
@@ -105,3 +105,4 @@ if (typeof globalThis !== 'undefined' && globalThis.expect) {
105
105
  },
106
106
  });
107
107
  }
108
+ //# sourceMappingURL=vitestMatchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitestMatchers.js","sourceRoot":"","sources":["../../src/vitestMatchers.ts"],"names":[],"mappings":"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","sourcesContent":["// Extend Vitest's expect with custom matchers for generators\ninterface CustomMatchers<R = unknown> {\n toYieldValue(expected: any): R;\n toCompleteWith(expected: any): R;\n toYieldSequence(sequence: Array<{ yields?: any; given?: any; returns?: any }>): R;\n}\n\ndeclare module 'vitest' {\n interface Assertion<T = any> extends CustomMatchers<T> {}\n interface AsymmetricMatchersContaining extends CustomMatchers {}\n}\n\n// Only register matchers if expect is available\nif (typeof globalThis !== 'undefined' && (globalThis as any).expect) {\n const expect = (globalThis as any).expect;\n expect.extend({\n toYieldValue(received: Generator, expected: any) {\n const { value, done } = received.next();\n\n if (done) {\n return {\n pass: false,\n message: () => `Expected generator to yield a value, but it completed`,\n actual: { done: true, value },\n expected,\n };\n }\n\n const pass = this.equals(value, expected);\n return {\n pass,\n message: () =>\n pass\n ? `Expected generator not to yield ${this.utils.printExpected(expected)}`\n : `Expected generator to yield ${this.utils.printExpected(expected)}, but yielded ${this.utils.printReceived(value)}`,\n actual: value,\n expected,\n };\n },\n\n toCompleteWith(received: Generator, expected: any) {\n const { value, done } = received.next(expected);\n\n if (!done) {\n return {\n pass: false,\n message: () => `Expected generator to complete, but it yielded ${this.utils.printReceived(value)}`,\n actual: { done: false, value },\n expected: { done: true, value: expected },\n };\n }\n\n const pass = value === expected;\n return {\n pass,\n message: () =>\n pass\n ? `Expected generator not to return ${this.utils.printExpected(expected)}`\n : `Expected generator to return ${this.utils.printExpected(expected)}, but returned ${this.utils.printReceived(value)}`,\n actual: value,\n expected,\n };\n },\n\n toYieldSequence(received: Generator, sequence: any[]) {\n const results: any[] = [];\n let currentStep = 0;\n\n for (const step of sequence) {\n if (step.yields !== undefined) {\n const { value, done } = received.next();\n results.push({ step: currentStep, yielded: value, done });\n\n if (done) {\n return {\n pass: false,\n message: () => `Expected generator to yield at step ${currentStep}, but it completed`,\n actual: results,\n expected: sequence,\n };\n }\n\n if (!this.equals(value, step.yields)) {\n return {\n pass: false,\n message: () =>\n `At step ${currentStep}: expected to yield ${this.utils.printExpected(step.yields)}, ` +\n `but yielded ${this.utils.printReceived(value)}`,\n actual: value,\n expected: step.yields,\n };\n }\n }\n\n if (step.given !== undefined) {\n // Input will be used in next iteration\n }\n\n if (step.returns !== undefined) {\n const input = sequence[currentStep - 1]?.given;\n const { value, done } = received.next(input);\n results.push({ step: currentStep, returned: value, done });\n\n if (!done) {\n return {\n pass: false,\n message: () => `Expected generator to complete at step ${currentStep}, but it yielded`,\n actual: results,\n expected: sequence,\n };\n }\n\n if (!this.equals(value, step.returns)) {\n return {\n pass: false,\n message: () =>\n `At step ${currentStep}: expected to return ${this.utils.printExpected(step.returns)}, ` +\n `but returned ${this.utils.printReceived(value)}`,\n actual: value,\n expected: step.returns,\n };\n }\n }\n\n currentStep++;\n }\n\n return {\n pass: true,\n message: () => `Expected generator not to match sequence`,\n actual: results,\n expected: sequence,\n };\n },\n });\n}\n"]}
@@ -82,3 +82,4 @@ export function mockGeneratorYieldReturn(yieldValue, returnValue) {
82
82
  return returnValue;
83
83
  })();
84
84
  }
85
+ //# sourceMappingURL=generatorExpect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatorExpect.js","sourceRoot":"","sources":["../../src/generatorExpect.ts"],"names":[],"mappings":"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","sourcesContent":["interface GeneratorStep {\n type: 'yield' | 'return';\n value: any;\n input?: any;\n}\n\nexport class GeneratorExpectChain<T = any> {\n private steps: GeneratorStep[] = [];\n private lastInput: any;\n private expect: any;\n\n constructor(\n private generator: Generator<any, any, any>,\n expect?: any,\n ) {\n // Use global expect if available, otherwise use provided expect\n this.expect = expect || (globalThis as any).expect;\n if (!this.expect) {\n throw new Error('expect function not found. Please ensure Vitest or another test framework is available.');\n }\n }\n\n toYield(expected: any): this {\n const { value, done } = this.generator.next();\n this.expect(done).toBe(false);\n this.expect(value).toEqual(expected);\n this.steps.push({ type: 'yield', value });\n return this;\n }\n\n toYieldAction(expected: any): this {\n return this.toYield(expected);\n }\n\n // Multiple name options for clarity in different contexts\n whenGiven(input: any): this {\n this.lastInput = input;\n return this;\n }\n\n andReceive(input: any): this {\n return this.whenGiven(input);\n }\n\n withResponse(input: any): this {\n return this.whenGiven(input);\n }\n\n thenYield(expected: any): this {\n const { value, done } = this.generator.next(this.lastInput);\n this.expect(done).toBe(false);\n this.expect(value).toEqual(expected);\n this.steps.push({ type: 'yield', value, input: this.lastInput });\n this.lastInput = undefined;\n return this;\n }\n\n thenReturn(expected: any): void {\n const { value, done } = this.generator.next(this.lastInput);\n this.expect(done).toBe(true);\n this.expect(value).toStrictEqual(expected);\n this.steps.push({ type: 'return', value, input: this.lastInput });\n }\n\n // Alternative terminator that doesn't check the return value\n thenComplete(): void {\n const { done } = this.generator.next(this.lastInput);\n this.expect(done).toBe(true);\n }\n\n // For debugging - returns current execution steps\n getSteps(): GeneratorStep[] {\n return [...this.steps];\n }\n\n // Snapshot support for recording generator behavior\n toMatchSnapshot(name?: string): void {\n this.expect(this.steps).toMatchSnapshot(name);\n }\n}\n\nexport function expectGenerator<T>(gen: Generator<any, T, any>, expect?: any): GeneratorExpectChain<T> {\n return new GeneratorExpectChain(gen, expect);\n}\n\n/**\n * Helper to create a generator that returns immediately without yielding\n * Useful for mocking sub-generators in tests\n */\nexport function mockGeneratorReturn<T>(value: T): Generator<any, T, any> {\n return (function* () {\n return value;\n })();\n}\n\n/**\n * Helper to create a generator that yields once then returns\n * Useful for mocking sub-generators that need to yield an action\n */\nexport function mockGeneratorYieldReturn<Y, R>(yieldValue: Y, returnValue: R): Generator<Y, R, any> {\n return (function* () {\n yield yieldValue;\n return returnValue;\n })();\n}\n"]}
package/lib/esm/index.js CHANGED
@@ -3,3 +3,4 @@ export * from './types';
3
3
  // Export vitestMatchers for explicit import by Vitest users
4
4
  // Users should import this explicitly: import 'quidproquo-testing/vitest'
5
5
  // We don't auto-import since not all users may be using Vitest
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,cAAc,SAAS,CAAC;AAExB,4DAA4D;AAC5D,0EAA0E;AAC1E,+DAA+D","sourcesContent":["export { expectGenerator, GeneratorExpectChain } from './generatorExpect';\nexport * from './types';\n\n// Export vitestMatchers for explicit import by Vitest users\n// Users should import this explicitly: import 'quidproquo-testing/vitest'\n// We don't auto-import since not all users may be using Vitest\n"]}
package/lib/esm/types.js CHANGED
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["// Test utility types\nexport interface GeneratorTestStep<T = any> {\n yields?: T;\n given?: any;\n returns?: any;\n}\n\nexport type GeneratorTestSequence<T = any> = GeneratorTestStep<T>[];\n"]}
package/lib/esm/vitest.js CHANGED
@@ -2,3 +2,4 @@
2
2
  // Import this in your test setup: import 'quidproquo-testing/vitest'
3
3
  import './vitestMatchers';
4
4
  export * from './index';
5
+ //# sourceMappingURL=vitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/vitest.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,qEAAqE;AACrE,OAAO,kBAAkB,CAAC;AAE1B,cAAc,SAAS,CAAC","sourcesContent":["// Entry point for Vitest users to register custom matchers\n// Import this in your test setup: import 'quidproquo-testing/vitest'\nimport './vitestMatchers';\n\nexport * from './index';\n"]}
@@ -104,3 +104,4 @@ if (typeof globalThis !== 'undefined' && globalThis.expect) {
104
104
  },
105
105
  });
106
106
  }
107
+ //# sourceMappingURL=vitestMatchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitestMatchers.js","sourceRoot":"","sources":["../../src/vitestMatchers.ts"],"names":[],"mappings":"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","sourcesContent":["// Extend Vitest's expect with custom matchers for generators\ninterface CustomMatchers<R = unknown> {\n toYieldValue(expected: any): R;\n toCompleteWith(expected: any): R;\n toYieldSequence(sequence: Array<{ yields?: any; given?: any; returns?: any }>): R;\n}\n\ndeclare module 'vitest' {\n interface Assertion<T = any> extends CustomMatchers<T> {}\n interface AsymmetricMatchersContaining extends CustomMatchers {}\n}\n\n// Only register matchers if expect is available\nif (typeof globalThis !== 'undefined' && (globalThis as any).expect) {\n const expect = (globalThis as any).expect;\n expect.extend({\n toYieldValue(received: Generator, expected: any) {\n const { value, done } = received.next();\n\n if (done) {\n return {\n pass: false,\n message: () => `Expected generator to yield a value, but it completed`,\n actual: { done: true, value },\n expected,\n };\n }\n\n const pass = this.equals(value, expected);\n return {\n pass,\n message: () =>\n pass\n ? `Expected generator not to yield ${this.utils.printExpected(expected)}`\n : `Expected generator to yield ${this.utils.printExpected(expected)}, but yielded ${this.utils.printReceived(value)}`,\n actual: value,\n expected,\n };\n },\n\n toCompleteWith(received: Generator, expected: any) {\n const { value, done } = received.next(expected);\n\n if (!done) {\n return {\n pass: false,\n message: () => `Expected generator to complete, but it yielded ${this.utils.printReceived(value)}`,\n actual: { done: false, value },\n expected: { done: true, value: expected },\n };\n }\n\n const pass = value === expected;\n return {\n pass,\n message: () =>\n pass\n ? `Expected generator not to return ${this.utils.printExpected(expected)}`\n : `Expected generator to return ${this.utils.printExpected(expected)}, but returned ${this.utils.printReceived(value)}`,\n actual: value,\n expected,\n };\n },\n\n toYieldSequence(received: Generator, sequence: any[]) {\n const results: any[] = [];\n let currentStep = 0;\n\n for (const step of sequence) {\n if (step.yields !== undefined) {\n const { value, done } = received.next();\n results.push({ step: currentStep, yielded: value, done });\n\n if (done) {\n return {\n pass: false,\n message: () => `Expected generator to yield at step ${currentStep}, but it completed`,\n actual: results,\n expected: sequence,\n };\n }\n\n if (!this.equals(value, step.yields)) {\n return {\n pass: false,\n message: () =>\n `At step ${currentStep}: expected to yield ${this.utils.printExpected(step.yields)}, ` +\n `but yielded ${this.utils.printReceived(value)}`,\n actual: value,\n expected: step.yields,\n };\n }\n }\n\n if (step.given !== undefined) {\n // Input will be used in next iteration\n }\n\n if (step.returns !== undefined) {\n const input = sequence[currentStep - 1]?.given;\n const { value, done } = received.next(input);\n results.push({ step: currentStep, returned: value, done });\n\n if (!done) {\n return {\n pass: false,\n message: () => `Expected generator to complete at step ${currentStep}, but it yielded`,\n actual: results,\n expected: sequence,\n };\n }\n\n if (!this.equals(value, step.returns)) {\n return {\n pass: false,\n message: () =>\n `At step ${currentStep}: expected to return ${this.utils.printExpected(step.returns)}, ` +\n `but returned ${this.utils.printReceived(value)}`,\n actual: value,\n expected: step.returns,\n };\n }\n }\n\n currentStep++;\n }\n\n return {\n pass: true,\n message: () => `Expected generator not to match sequence`,\n actual: results,\n expected: sequence,\n };\n },\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quidproquo-testing",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "",
5
5
  "main": "./lib/commonjs/index.js",
6
6
  "module": "./lib/esm/index.js",
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "homepage": "https://github.com/joe-coady/quidproquo#readme",
46
46
  "devDependencies": {
47
- "quidproquo-tsconfig": "0.1.3",
47
+ "quidproquo-tsconfig": "0.1.5",
48
48
  "typescript": "^5.8.2",
49
49
  "vitest": "^3.2.4"
50
50
  },