peerbench 0.0.8 → 0.0.9

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.
@@ -4,6 +4,9 @@ import {
4
4
  import {
5
5
  defineRunner
6
6
  } from "../chunk-RTEAK4II.js";
7
+ import {
8
+ AbstractLLMProvider
9
+ } from "../chunk-SMLNDQFX.js";
7
10
  import {
8
11
  BaseResponseSchemaV1,
9
12
  BaseScoreSchemaV1,
@@ -17,8 +20,8 @@ import {
17
20
  ScoringMethod
18
21
  } from "../chunk-HMQYGCKI.js";
19
22
  import {
20
- AbstractLLMProvider
21
- } from "../chunk-SMLNDQFX.js";
23
+ JSONFileStorage
24
+ } from "../chunk-WBCMV445.js";
22
25
  import {
23
26
  LLMAsAJudgeScorer,
24
27
  MCQScorer
@@ -26,9 +29,6 @@ import {
26
29
  import {
27
30
  PEERBENCH_NAMESPACE
28
31
  } from "../chunk-UHHHSYVE.js";
29
- import {
30
- JSONFileStorage
31
- } from "../chunk-JFLUJLGT.js";
32
32
  import {
33
33
  idGeneratorUUIDv7
34
34
  } from "../chunk-4UBK6452.js";
@@ -72,6 +72,24 @@ var AbstractFileStorageCodec = class {
72
72
  // TODO: Add other methods like write, append, read one etc.
73
73
  };
74
74
 
75
+ // src/utils/json.ts
76
+ import { stringify } from "safe-stable-stringify";
77
+ function parseJSONL(str, options) {
78
+ return str.split("\n").filter((line) => line.trim() !== "").map((line) => {
79
+ const obj = tryParseJson(line);
80
+ if (options?.errorOnInvalid && !obj) {
81
+ throw new Error(`Invalid JSON line: ${line}`);
82
+ }
83
+ return obj;
84
+ }).filter((obj) => obj !== void 0);
85
+ }
86
+ function tryParseJson(content) {
87
+ try {
88
+ return JSON.parse(content);
89
+ } catch {
90
+ }
91
+ }
92
+
75
93
  // src/storages/json-file.ts
76
94
  var JSONFileStorage = class extends FileStorage {
77
95
  constructor(config) {
@@ -101,7 +119,9 @@ var JSONFileStorageCodec = class extends AbstractFileStorageCodec {
101
119
  })) {
102
120
  wholeFile.set(chunk.bytes, chunk.offset);
103
121
  }
104
- return this.schema.array().parse(JSON.parse(bufferToString(wholeFile)));
122
+ const content = bufferToString(wholeFile);
123
+ const parsed = tryParseJson(content) ?? parseJSONL(content, { errorOnInvalid: true });
124
+ return this.schema.array().parse(parsed);
105
125
  }
106
126
  };
107
127
 
@@ -112,4 +132,4 @@ export {
112
132
  JSONFileStorage,
113
133
  JSONFileStorageCodec
114
134
  };
115
- //# sourceMappingURL=chunk-JFLUJLGT.js.map
135
+ //# sourceMappingURL=chunk-WBCMV445.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storages/abstract.ts","../src/storages/file.ts","../src/utils/json.ts","../src/storages/json-file.ts"],"sourcesContent":["export abstract class AbstractStorage<TObject> {\n abstract init(params?: unknown): Promise<void>;\n abstract read(key: string, params?: unknown): Promise<TObject | null>;\n abstract readAll(params?: unknown): Promise<TObject[]>;\n abstract write(\n key: string,\n value: TObject,\n params?: unknown\n ): Promise<unknown>;\n\n async count(): Promise<number> {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import { FileHandle, open } from \"node:fs/promises\";\nimport { AbstractStorage } from \"./abstract\";\n\nexport class FileStorage<TObject> extends AbstractStorage<TObject> {\n protected path: string;\n protected codec: AbstractFileStorageCodec<TObject>;\n protected fileHandle: FileHandle | undefined;\n\n constructor(config: {\n path: string;\n codec: AbstractFileStorageCodec<TObject>;\n }) {\n super();\n this.path = config.path;\n this.codec = config.codec;\n }\n\n async init(): Promise<void> {\n this.fileHandle = await open(this.path, \"r+\");\n }\n\n override async read(\n _key: string,\n _params?: unknown\n ): Promise<TObject | null> {\n throw new Error(\"Method not implemented.\");\n }\n\n override async readAll(_params?: unknown): Promise<TObject[]> {\n this.assertInitialized();\n\n return await this.codec.readAll({\n fileHandle: {\n readAt: this.readAt.bind(this),\n readChunks: this.readChunks.bind(this),\n size: this.size.bind(this),\n },\n });\n }\n\n override async write(\n _key: string,\n _value: TObject,\n _params?: unknown\n ): Promise<unknown> {\n throw new Error(\"Method not implemented.\");\n }\n\n protected async *readChunks(params: {\n startOffset?: number;\n chunkSize: number;\n }): AsyncIterable<{ offset: number; bytes: Uint8Array }> {\n this.assertInitialized();\n\n const fileSize = await this.size();\n let offset = params.startOffset ?? 0;\n\n // NOTE: What if the file size changed during the iteration?\n while (offset < fileSize) {\n const length = Math.min(params.chunkSize, fileSize - offset);\n if (length === 0) break;\n\n const bytes = await this.readAt(offset, length);\n if (bytes.length === 0) break;\n yield { offset, bytes };\n offset += bytes.length;\n }\n }\n\n protected async size(): Promise<number> {\n this.assertInitialized();\n\n return await this.fileHandle.stat().then((stat) => stat.size);\n }\n\n protected async readAt(offset: number, length: number): Promise<Uint8Array> {\n this.assertInitialized();\n\n const buffer = new Uint8Array(length);\n const result = await this.fileHandle.read(buffer, 0, length, offset);\n\n return new Uint8Array(buffer.subarray(0, result.bytesRead));\n }\n\n protected assertInitialized(): asserts this is this & {\n fileHandle: FileHandle;\n } {\n if (!this.fileHandle) {\n throw new Error(\"File Storage is not initialized\");\n }\n }\n}\n\nexport type FileStorageFileHandle = {\n size(): Promise<number>;\n readAt(offset: number, length: number): Promise<Uint8Array>;\n readChunks(params: {\n startOffset?: number;\n chunkSize: number;\n }): AsyncIterable<{ offset: number; bytes: Uint8Array }>;\n};\n\nexport abstract class AbstractFileStorageCodec<TObject> {\n abstract readAll(params: {\n fileHandle: FileStorageFileHandle;\n }): Promise<TObject[]>;\n // TODO: Add other methods like write, append, read one etc.\n}\n","import { stringify } from \"safe-stable-stringify\";\n\n/**\n * Parses JSONL formatted string into an array\n * @returns An array of parsed JSON lines\n */\nexport function parseJSONL<T>(\n str: string,\n options?: { errorOnInvalid?: boolean }\n): T[] {\n return str\n .split(\"\\n\") // Split per line\n .filter((line) => line.trim() !== \"\") // Filter empty lines\n .map((line) => {\n const obj = tryParseJson(line);\n if (options?.errorOnInvalid && !obj) {\n throw new Error(`Invalid JSON line: ${line}`);\n }\n return obj;\n }) // Parse line (parse as undefined if it is invalid)\n .filter((obj) => obj !== undefined); // Filter invalid lines\n}\n\n/**\n * Tries to parse the given string as JSON.\n * Returns `undefined` if it is not a valid JSON entity.\n */\nexport function tryParseJson<T = any>(content: string): T | undefined {\n try {\n return JSON.parse(content);\n } catch {\n // Invalid JSON\n }\n}\n\n/**\n * Stringifies the given JSON value using `safe-stable-stringify` in a stable manner.\n * This stable method generates the same string output for the same input value (including objects).\n */\nexport function stableStringify(value: any) {\n return stringify(value);\n}\n","import { bufferToString } from \"@/utils\";\nimport { tryParseJson, parseJSONL } from \"@/utils/json\";\nimport {\n AbstractFileStorageCodec,\n FileStorage,\n FileStorageFileHandle,\n} from \"./file\";\nimport z from \"zod\";\n\nexport class JSONFileStorage<TObject> extends FileStorage<TObject> {\n declare codec: JSONFileStorageCodec<TObject>;\n\n constructor(config: {\n path: string;\n chunkSize?: number;\n schema: z.ZodType<TObject>;\n }) {\n super({\n path: config.path,\n codec: new JSONFileStorageCodec({\n chunkSize: config.chunkSize,\n schema: config.schema,\n }),\n });\n }\n}\n\nexport class JSONFileStorageCodec<\n TObject,\n> extends AbstractFileStorageCodec<TObject> {\n private chunkSize: number;\n private schema: z.ZodType<TObject>;\n\n constructor(config: { chunkSize?: number; schema: z.ZodType<TObject> }) {\n super();\n this.chunkSize = config?.chunkSize ?? 64 * 1024;\n this.schema = config.schema;\n }\n\n async readAll(params: {\n fileHandle: FileStorageFileHandle;\n }): Promise<TObject[]> {\n const wholeFile: Uint8Array = new Uint8Array(\n await params.fileHandle.size()\n );\n for await (const chunk of params.fileHandle.readChunks({\n chunkSize: this.chunkSize,\n })) {\n wholeFile.set(chunk.bytes, chunk.offset);\n }\n\n const content = bufferToString(wholeFile);\n const parsed =\n tryParseJson(content) ?? parseJSONL(content, { errorOnInvalid: true });\n\n return this.schema.array().parse(parsed);\n }\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  FileStorage,
5
5
  JSONFileStorage,
6
6
  JSONFileStorageCodec
7
- } from "../chunk-JFLUJLGT.js";
7
+ } from "../chunk-WBCMV445.js";
8
8
  import "../chunk-4UBK6452.js";
9
9
  import "../chunk-PZ5AY32C.js";
10
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peerbench",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "description": "Tooling help work with AI benchmarking data and create trustworthy AI",
5
5
  "keywords": [
6
6
  "ai",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/storages/abstract.ts","../src/storages/file.ts","../src/storages/json-file.ts"],"sourcesContent":["export abstract class AbstractStorage<TObject> {\n abstract init(params?: unknown): Promise<void>;\n abstract read(key: string, params?: unknown): Promise<TObject | null>;\n abstract readAll(params?: unknown): Promise<TObject[]>;\n abstract write(\n key: string,\n value: TObject,\n params?: unknown\n ): Promise<unknown>;\n\n async count(): Promise<number> {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import { FileHandle, open } from \"node:fs/promises\";\nimport { AbstractStorage } from \"./abstract\";\n\nexport class FileStorage<TObject> extends AbstractStorage<TObject> {\n protected path: string;\n protected codec: AbstractFileStorageCodec<TObject>;\n protected fileHandle: FileHandle | undefined;\n\n constructor(config: {\n path: string;\n codec: AbstractFileStorageCodec<TObject>;\n }) {\n super();\n this.path = config.path;\n this.codec = config.codec;\n }\n\n async init(): Promise<void> {\n this.fileHandle = await open(this.path, \"r+\");\n }\n\n override async read(\n _key: string,\n _params?: unknown\n ): Promise<TObject | null> {\n throw new Error(\"Method not implemented.\");\n }\n\n override async readAll(_params?: unknown): Promise<TObject[]> {\n this.assertInitialized();\n\n return await this.codec.readAll({\n fileHandle: {\n readAt: this.readAt.bind(this),\n readChunks: this.readChunks.bind(this),\n size: this.size.bind(this),\n },\n });\n }\n\n override async write(\n _key: string,\n _value: TObject,\n _params?: unknown\n ): Promise<unknown> {\n throw new Error(\"Method not implemented.\");\n }\n\n protected async *readChunks(params: {\n startOffset?: number;\n chunkSize: number;\n }): AsyncIterable<{ offset: number; bytes: Uint8Array }> {\n this.assertInitialized();\n\n const fileSize = await this.size();\n let offset = params.startOffset ?? 0;\n\n // NOTE: What if the file size changed during the iteration?\n while (offset < fileSize) {\n const length = Math.min(params.chunkSize, fileSize - offset);\n if (length === 0) break;\n\n const bytes = await this.readAt(offset, length);\n if (bytes.length === 0) break;\n yield { offset, bytes };\n offset += bytes.length;\n }\n }\n\n protected async size(): Promise<number> {\n this.assertInitialized();\n\n return await this.fileHandle.stat().then((stat) => stat.size);\n }\n\n protected async readAt(offset: number, length: number): Promise<Uint8Array> {\n this.assertInitialized();\n\n const buffer = new Uint8Array(length);\n const result = await this.fileHandle.read(buffer, 0, length, offset);\n\n return new Uint8Array(buffer.subarray(0, result.bytesRead));\n }\n\n protected assertInitialized(): asserts this is this & {\n fileHandle: FileHandle;\n } {\n if (!this.fileHandle) {\n throw new Error(\"File Storage is not initialized\");\n }\n }\n}\n\nexport type FileStorageFileHandle = {\n size(): Promise<number>;\n readAt(offset: number, length: number): Promise<Uint8Array>;\n readChunks(params: {\n startOffset?: number;\n chunkSize: number;\n }): AsyncIterable<{ offset: number; bytes: Uint8Array }>;\n};\n\nexport abstract class AbstractFileStorageCodec<TObject> {\n abstract readAll(params: {\n fileHandle: FileStorageFileHandle;\n }): Promise<TObject[]>;\n // TODO: Add other methods like write, append, read one etc.\n}\n","import { bufferToString } from \"@/utils\";\nimport {\n AbstractFileStorageCodec,\n FileStorage,\n FileStorageFileHandle,\n} from \"./file\";\nimport z from \"zod\";\n\nexport class JSONFileStorage<TObject> extends FileStorage<TObject> {\n declare codec: JSONFileStorageCodec<TObject>;\n\n constructor(config: {\n path: string;\n chunkSize?: number;\n schema: z.ZodType<TObject>;\n }) {\n super({\n path: config.path,\n codec: new JSONFileStorageCodec({\n chunkSize: config.chunkSize,\n schema: config.schema,\n }),\n });\n }\n}\n\nexport class JSONFileStorageCodec<\n TObject,\n> extends AbstractFileStorageCodec<TObject> {\n private chunkSize: number;\n private schema: z.ZodType<TObject>;\n\n constructor(config: { chunkSize?: number; schema: z.ZodType<TObject> }) {\n super();\n this.chunkSize = config?.chunkSize ?? 64 * 1024;\n this.schema = config.schema;\n }\n\n async readAll(params: {\n fileHandle: FileStorageFileHandle;\n }): Promise<TObject[]> {\n const wholeFile: Uint8Array = new Uint8Array(\n await params.fileHandle.size()\n );\n for await (const chunk of params.fileHandle.readChunks({\n chunkSize: this.chunkSize,\n })) {\n wholeFile.set(chunk.bytes, chunk.offset);\n }\n\n return this.schema.array().parse(JSON.parse(bufferToString(wholeFile)));\n }\n}\n"],"mappings":"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","names":[]}