jest-fuzzy 0.1.0 → 0.1.1

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.
Files changed (52) hide show
  1. package/README.md +69 -46
  2. package/dist/cjs/config.d.ts +5 -2
  3. package/dist/cjs/config.d.ts.map +1 -1
  4. package/dist/cjs/config.js +4 -1
  5. package/dist/cjs/config.js.map +1 -1
  6. package/dist/cjs/index.d.ts +2 -2
  7. package/dist/cjs/index.d.ts.map +1 -1
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/providers/anthropic.d.ts +2 -2
  10. package/dist/cjs/providers/anthropic.d.ts.map +1 -1
  11. package/dist/cjs/providers/anthropic.js +45 -73
  12. package/dist/cjs/providers/anthropic.js.map +1 -1
  13. package/dist/cjs/providers/google.d.ts +2 -2
  14. package/dist/cjs/providers/google.d.ts.map +1 -1
  15. package/dist/cjs/providers/google.js +50 -75
  16. package/dist/cjs/providers/google.js.map +1 -1
  17. package/dist/cjs/providers/index.d.ts +2 -2
  18. package/dist/cjs/providers/index.d.ts.map +1 -1
  19. package/dist/cjs/providers/index.js +4 -4
  20. package/dist/cjs/providers/index.js.map +1 -1
  21. package/dist/cjs/providers/openai.d.ts +2 -2
  22. package/dist/cjs/providers/openai.d.ts.map +1 -1
  23. package/dist/cjs/providers/openai.js +37 -58
  24. package/dist/cjs/providers/openai.js.map +1 -1
  25. package/dist/cjs/types.d.ts +6 -0
  26. package/dist/cjs/types.d.ts.map +1 -1
  27. package/dist/esm/config.d.ts +5 -2
  28. package/dist/esm/config.d.ts.map +1 -1
  29. package/dist/esm/config.js +4 -1
  30. package/dist/esm/config.js.map +1 -1
  31. package/dist/esm/index.d.ts +2 -2
  32. package/dist/esm/index.d.ts.map +1 -1
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/esm/providers/anthropic.d.ts +2 -2
  35. package/dist/esm/providers/anthropic.d.ts.map +1 -1
  36. package/dist/esm/providers/anthropic.js +45 -40
  37. package/dist/esm/providers/anthropic.js.map +1 -1
  38. package/dist/esm/providers/google.d.ts +2 -2
  39. package/dist/esm/providers/google.d.ts.map +1 -1
  40. package/dist/esm/providers/google.js +50 -42
  41. package/dist/esm/providers/google.js.map +1 -1
  42. package/dist/esm/providers/index.d.ts +2 -2
  43. package/dist/esm/providers/index.d.ts.map +1 -1
  44. package/dist/esm/providers/index.js +4 -4
  45. package/dist/esm/providers/index.js.map +1 -1
  46. package/dist/esm/providers/openai.d.ts +2 -2
  47. package/dist/esm/providers/openai.d.ts.map +1 -1
  48. package/dist/esm/providers/openai.js +37 -25
  49. package/dist/esm/providers/openai.js.map +1 -1
  50. package/dist/esm/types.d.ts +6 -0
  51. package/dist/esm/types.d.ts.map +1 -1
  52. package/package.json +1 -20
@@ -1,8 +1,8 @@
1
1
  import type { LLMProvider, JudgmentResult } from "../types.js";
2
2
  export declare class OpenAIProvider implements LLMProvider {
3
- private client;
3
+ private apiKey;
4
4
  private constructor();
5
- static create(): Promise<OpenAIProvider>;
5
+ static create(apiKey?: string): Promise<OpenAIProvider>;
6
6
  judge(prompt: string): Promise<JudgmentResult>;
7
7
  }
8
8
  //# sourceMappingURL=openai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkB/D,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAM;IAEpB,OAAO;WAIM,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;IAkBxC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CA8BrD"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoB/D,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;WAIM,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAWvD,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAgDrD"}
@@ -1,3 +1,4 @@
1
+ const OPENAI_API_URL = "https://api.openai.com/v1/chat/completions";
1
2
  const JUDGMENT_SCHEMA = {
2
3
  type: "object",
3
4
  properties: {
@@ -14,31 +15,37 @@ const JUDGMENT_SCHEMA = {
14
15
  additionalProperties: false,
15
16
  };
16
17
  export class OpenAIProvider {
17
- client;
18
- constructor(client) {
19
- this.client = client;
18
+ apiKey;
19
+ constructor(apiKey) {
20
+ this.apiKey = apiKey;
20
21
  }
21
- static async create() {
22
- const apiKey = process.env.OPENAI_API_KEY;
23
- if (!apiKey) {
24
- throw new Error("jest-fuzzy: Missing OPENAI_API_KEY environment variable for gpt-5-nano model");
25
- }
26
- try {
27
- const module = await import("openai");
28
- const OpenAI = module.default;
29
- const client = new OpenAI({ apiKey });
30
- return new OpenAIProvider(client);
31
- }
32
- catch (e) {
33
- throw new Error("jest-fuzzy: To use gpt-5-nano, install openai");
22
+ static async create(apiKey) {
23
+ const key = apiKey ?? process.env.OPENAI_API_KEY;
24
+ if (!key) {
25
+ throw new Error("jest-fuzzy: Missing API key for gpt-5-nano model. " +
26
+ "Either pass it via configure({ apiKeys: { openai: '...' } }) or set OPENAI_API_KEY environment variable.");
34
27
  }
28
+ return new OpenAIProvider(key);
35
29
  }
36
30
  async judge(prompt) {
37
- try {
38
- const response = await this.client.chat.completions.create({
31
+ const response = await fetch(OPENAI_API_URL, {
32
+ method: "POST",
33
+ headers: {
34
+ "Content-Type": "application/json",
35
+ Authorization: `Bearer ${this.apiKey}`,
36
+ },
37
+ body: JSON.stringify({
39
38
  model: "gpt-4o-mini",
40
- messages: [{ role: "user", content: prompt }],
41
39
  max_tokens: 1024,
40
+ messages: [
41
+ {
42
+ role: "system",
43
+ content: 'You must respond with valid JSON matching this schema: {"verdict": boolean, "explanation": string}. ' +
44
+ '"verdict" should be true if the condition is satisfied, false otherwise. ' +
45
+ '"explanation" should briefly explain your reasoning.',
46
+ },
47
+ { role: "user", content: prompt },
48
+ ],
42
49
  response_format: {
43
50
  type: "json_schema",
44
51
  json_schema: {
@@ -47,14 +54,19 @@ export class OpenAIProvider {
47
54
  schema: JUDGMENT_SCHEMA,
48
55
  },
49
56
  },
50
- });
51
- const content = response.choices[0].message.content ?? "{}";
52
- const parsed = JSON.parse(content);
53
- return { verdict: parsed.verdict, explanation: parsed.explanation };
57
+ }),
58
+ });
59
+ if (!response.ok) {
60
+ const errorText = await response.text();
61
+ throw new Error(`jest-fuzzy: OpenAI API error (${response.status}): ${errorText}`);
54
62
  }
55
- catch (error) {
56
- throw new Error(`jest-fuzzy: LLM API call failed: ${error instanceof Error ? error.message : String(error)}`);
63
+ const data = (await response.json());
64
+ const content = data.choices?.[0]?.message?.content;
65
+ if (!content) {
66
+ throw new Error("jest-fuzzy: OpenAI API returned no content");
57
67
  }
68
+ const parsed = JSON.parse(content);
69
+ return { verdict: parsed.verdict, explanation: parsed.explanation };
58
70
  }
59
71
  }
60
72
  //# sourceMappingURL=openai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,QAAiB;IACvB,UAAU,EAAE;QACV,OAAO,EAAE;YACP,IAAI,EAAE,SAAkB;YACxB,WAAW,EAAE,qDAAqD;SACnE;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,WAAW,EAAE,oCAAoC;SAClD;KACF;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;IACpC,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,OAAO,cAAc;IACjB,MAAM,CAAM;IAEpB,YAAoB,MAAW;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACzD,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC7C,UAAU,EAAE,IAAI;gBAChB,eAAe,EAAE;oBACf,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE;wBACX,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,eAAe;qBACxB;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;YAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAGhC,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,oCACE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,4CAA4C,CAAC;AAEpE,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,QAAiB;IACvB,UAAU,EAAE;QACV,OAAO,EAAE;YACP,IAAI,EAAE,SAAkB;YACxB,WAAW,EAAE,qDAAqD;SACnE;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,WAAW,EAAE,oCAAoC;SAClD;KACF;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAU;IAC7C,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,OAAO,cAAc;IACjB,MAAM,CAAS;IAEvB,YAAoB,MAAc;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAe;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,oDAAoD;gBAClD,0GAA0G,CAC7G,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,aAAa;gBACpB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,QAAQ;wBACd,OAAO,EACL,sGAAsG;4BACtG,2EAA2E;4BAC3E,sDAAsD;qBACzD;oBACD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;iBAClC;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE;wBACX,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,eAAe;qBACxB;iBACF;aACF,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;QAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA8C,CAAC;QAChF,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;CACF"}
@@ -1,6 +1,12 @@
1
1
  export type ModelName = "claude-haiku-4-5" | "gemini-3-flash-preview" | "gpt-5-nano";
2
+ export interface ApiKeys {
3
+ anthropic?: string;
4
+ google?: string;
5
+ openai?: string;
6
+ }
2
7
  export interface JestFuzzyConfig {
3
8
  model?: ModelName;
9
+ apiKeys?: ApiKeys;
4
10
  }
5
11
  export interface SemanticMatchOptions {
6
12
  threshold?: "strict" | "loose";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,wBAAwB,GACxB,YAAY,CAAC;AAEjB,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,MAAM,CAAC;CACvB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,IAAI,CAAC;QACb,UAAU,QAAQ,CAAC,CAAC;YAClB,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,CAAC,CAAC,CAAC;YACd,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;SACzC;KACF;CACF"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,wBAAwB,GACxB,YAAY,CAAC;AAEjB,MAAM,WAAW,OAAO;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,MAAM,CAAC;CACvB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,IAAI,CAAC;QACb,UAAU,QAAQ,CAAC,CAAC;YAClB,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,CAAC,CAAC,CAAC;YACd,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;SACzC;KACF;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jest-fuzzy",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "LLM-powered fuzzy matchers for Jest",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -37,30 +37,11 @@
37
37
  ],
38
38
  "license": "MIT",
39
39
  "devDependencies": {
40
- "@anthropic-ai/sdk": "^0.39.0",
41
- "@google/generative-ai": "^0.21.0",
42
40
  "@types/jest": "^29.5.14",
43
41
  "@types/node": "^22.10.5",
44
42
  "dotenv": "^16.4.7",
45
43
  "jest": "^29.7.0",
46
- "openai": "^4.77.3",
47
44
  "ts-jest": "^29.2.5",
48
45
  "typescript": "^5.7.2"
49
- },
50
- "peerDependencies": {
51
- "@anthropic-ai/sdk": ">=0.24.0",
52
- "@google/generative-ai": ">=0.10.0",
53
- "openai": ">=4.0.0"
54
- },
55
- "peerDependenciesMeta": {
56
- "@anthropic-ai/sdk": {
57
- "optional": true
58
- },
59
- "@google/generative-ai": {
60
- "optional": true
61
- },
62
- "openai": {
63
- "optional": true
64
- }
65
46
  }
66
47
  }