vectorjson 0.3.0 → 0.3.2
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.
- package/README.md +110 -72
- package/dist/index.d.ts +17 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -59,6 +59,24 @@ parser.destroy();
|
|
|
59
59
|
|
|
60
60
|
`getValue()` returns a **live JS object** that grows incrementally on each `feed()`. No re-parsing — each byte is scanned exactly once.
|
|
61
61
|
|
|
62
|
+
**Schema-driven streaming** — pass a schema, get only what it defines. An LLM streams a 50KB tool call with `name`, `age`, `bio`, `metadata` — but your schema only needs `name` and `age`. Everything else is skipped at the byte level, never allocated in JS:
|
|
63
|
+
|
|
64
|
+
```js
|
|
65
|
+
import { z } from "zod";
|
|
66
|
+
import { createParser } from "vectorjson";
|
|
67
|
+
|
|
68
|
+
const User = z.object({ name: z.string(), age: z.number() });
|
|
69
|
+
|
|
70
|
+
for await (const partial of createParser({ schema: User, source: response.body })) {
|
|
71
|
+
console.log(partial);
|
|
72
|
+
// { name: "Ali" } ← partial, render immediately
|
|
73
|
+
// { name: "Alice" }
|
|
74
|
+
// { name: "Alice", age: 30 } ← validated on complete
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The schema defines what to parse. Fields outside the schema are ignored during scanning — no objects created, no strings decoded, no memory wasted.
|
|
79
|
+
|
|
62
80
|
**Or skip intermediate access entirely** — if you only need the final value:
|
|
63
81
|
|
|
64
82
|
```js
|
|
@@ -80,7 +98,6 @@ const parser = createEventParser();
|
|
|
80
98
|
|
|
81
99
|
parser.on('tool', (e) => showToolUI(e.value)); // fires immediately
|
|
82
100
|
parser.onDelta('code', (e) => editor.append(e.value)); // streams char-by-char
|
|
83
|
-
parser.skip('explanation'); // never materialized
|
|
84
101
|
|
|
85
102
|
for await (const chunk of llmStream) {
|
|
86
103
|
parser.feed(chunk); // O(n) — only new bytes scanned
|
|
@@ -261,35 +278,12 @@ parser.onDelta('tool_calls[0].args.code', (e) => {
|
|
|
261
278
|
editor.append(e.value); // just the new characters, decoded
|
|
262
279
|
});
|
|
263
280
|
|
|
264
|
-
// Don't waste CPU on fields you don't need
|
|
265
|
-
parser.skip('tool_calls[*].args.explanation');
|
|
266
|
-
|
|
267
281
|
for await (const chunk of llmStream) {
|
|
268
282
|
parser.feed(chunk);
|
|
269
283
|
}
|
|
270
284
|
parser.destroy();
|
|
271
285
|
```
|
|
272
286
|
|
|
273
|
-
### Multi-root / NDJSON
|
|
274
|
-
|
|
275
|
-
Some LLM APIs stream multiple JSON values separated by newlines. VectorJSON auto-resets between values:
|
|
276
|
-
|
|
277
|
-
```js
|
|
278
|
-
import { createEventParser } from "vectorjson";
|
|
279
|
-
|
|
280
|
-
const parser = createEventParser({
|
|
281
|
-
multiRoot: true,
|
|
282
|
-
onRoot(event) {
|
|
283
|
-
console.log(`Root #${event.index}:`, event.value);
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
for await (const chunk of ndjsonStream) {
|
|
288
|
-
parser.feed(chunk);
|
|
289
|
-
}
|
|
290
|
-
parser.destroy();
|
|
291
|
-
```
|
|
292
|
-
|
|
293
287
|
### Mixed LLM output (chain-of-thought, code fences)
|
|
294
288
|
|
|
295
289
|
Some models emit thinking text before JSON, or wrap JSON in code fences. VectorJSON finds the JSON automatically:
|
|
@@ -308,56 +302,33 @@ parser.onText((text) => thinkingPanel.append(text)); // opt-in
|
|
|
308
302
|
parser.feed(llmOutput);
|
|
309
303
|
```
|
|
310
304
|
|
|
311
|
-
###
|
|
312
|
-
|
|
313
|
-
When streaming a large tool call, you often only need 2-3 fields. `pick` tells the parser to skip everything else during byte scanning — skipped fields never allocate JS objects:
|
|
314
|
-
|
|
315
|
-
```js
|
|
316
|
-
import { createParser } from "vectorjson";
|
|
317
|
-
|
|
318
|
-
const parser = createParser({ pick: ["name", "age"] });
|
|
319
|
-
parser.feed('{"name":"Alice","age":30,"bio":"...10KB of text...","metadata":{}}');
|
|
320
|
-
parser.getValue(); // { name: "Alice", age: 30 } — bio and metadata never materialized
|
|
321
|
-
parser.destroy();
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
Nested paths work with dot notation:
|
|
325
|
-
|
|
326
|
-
```js
|
|
327
|
-
const parser = createParser({ pick: ["user.name", "user.age"] });
|
|
328
|
-
parser.feed('{"user":{"name":"Bob","age":25,"role":"admin"},"extra":"data"}');
|
|
329
|
-
parser.getValue(); // { user: { name: "Bob", age: 25 } }
|
|
330
|
-
parser.destroy();
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
### `for await` — pull-based streaming from any source
|
|
305
|
+
### Schema-driven streaming — parse only what the schema defines
|
|
334
306
|
|
|
335
|
-
Pass a
|
|
307
|
+
Pass a schema and VectorJSON extracts only the fields it defines. Everything else is skipped at the byte level — no objects created, no strings decoded. Arrays are transparent: `{ users: z.array(z.object({ name })) }` picks through arrays automatically.
|
|
336
308
|
|
|
337
309
|
```js
|
|
310
|
+
import { z } from "zod";
|
|
338
311
|
import { createParser } from "vectorjson";
|
|
339
312
|
|
|
340
|
-
const
|
|
313
|
+
const User = z.object({ name: z.string(), age: z.number() });
|
|
341
314
|
|
|
342
|
-
for await (const partial of
|
|
315
|
+
for await (const partial of createParser({ schema: User, source: response.body })) {
|
|
343
316
|
console.log(partial);
|
|
344
|
-
// { name: "Ali" }
|
|
345
|
-
// { name: "Alice" }
|
|
346
|
-
// { name: "Alice", age: 30 }
|
|
317
|
+
// { name: "Ali" } ← partial, render immediately
|
|
318
|
+
// { name: "Alice", age: 30 } ← validated on complete
|
|
347
319
|
}
|
|
348
|
-
// Parser auto-destroys when the source ends or you break out of the loop
|
|
349
320
|
```
|
|
350
321
|
|
|
351
|
-
|
|
322
|
+
Both `createParser` and `createEventParser` support `source` + `for await`:
|
|
352
323
|
|
|
353
324
|
```js
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
325
|
+
import { createEventParser } from "vectorjson";
|
|
326
|
+
|
|
327
|
+
const parser = createEventParser({ source: response.body });
|
|
328
|
+
parser.on('tool', (e) => showToolUI(e.value));
|
|
358
329
|
|
|
359
330
|
for await (const partial of parser) {
|
|
360
|
-
updateUI(partial); //
|
|
331
|
+
updateUI(partial); // growing partial value
|
|
361
332
|
}
|
|
362
333
|
```
|
|
363
334
|
|
|
@@ -522,25 +493,29 @@ Each `feed()` processes only new bytes — O(n) total. Three overloads:
|
|
|
522
493
|
|
|
523
494
|
```ts
|
|
524
495
|
createParser(); // no validation
|
|
525
|
-
createParser(schema); //
|
|
526
|
-
createParser({
|
|
496
|
+
createParser(schema); // only parse schema fields, validate on complete
|
|
497
|
+
createParser({ schema, source }); // options object
|
|
527
498
|
```
|
|
528
499
|
|
|
529
500
|
**Options object:**
|
|
530
501
|
|
|
531
502
|
```ts
|
|
532
503
|
interface CreateParserOptions<T = unknown> {
|
|
533
|
-
|
|
534
|
-
schema?: ZodLike<T>; // validate on complete
|
|
504
|
+
schema?: ZodLike<T>; // only parse schema fields, validate on complete
|
|
535
505
|
source?: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array | string>;
|
|
536
506
|
}
|
|
537
507
|
```
|
|
538
508
|
|
|
509
|
+
When a `schema` is provided:
|
|
510
|
+
- Only fields defined in the schema are parsed — everything else is skipped at the byte level
|
|
511
|
+
- Arrays are transparent — `z.array(z.object({ name }))` parses `name` inside each array element
|
|
512
|
+
- On complete, `safeParse()` validates the final value
|
|
513
|
+
|
|
539
514
|
When `source` is provided, the parser becomes async-iterable — use `for await` to consume partial values:
|
|
540
515
|
|
|
541
516
|
```ts
|
|
542
|
-
for await (const partial of createParser({
|
|
543
|
-
console.log(partial); // growing object with only
|
|
517
|
+
for await (const partial of createParser({ schema: User, source: stream })) {
|
|
518
|
+
console.log(partial); // growing object with only schema fields
|
|
544
519
|
}
|
|
545
520
|
```
|
|
546
521
|
|
|
@@ -594,13 +569,39 @@ type DeepPartial<T> = T extends object
|
|
|
594
569
|
|
|
595
570
|
Event-driven streaming parser. Events fire synchronously during `feed()`.
|
|
596
571
|
|
|
572
|
+
```ts
|
|
573
|
+
createEventParser(); // basic
|
|
574
|
+
createEventParser({ source: stream }); // for-await iteration
|
|
575
|
+
createEventParser({ schema, source }); // schema + for-await
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
**Options:**
|
|
579
|
+
|
|
580
|
+
```ts
|
|
581
|
+
{
|
|
582
|
+
source?: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array | string>;
|
|
583
|
+
schema?: ZodLike<T>; // only parse schema fields (same as createParser)
|
|
584
|
+
// format?: "json" | "jsonl"; // planned — JSONL support for both parsers
|
|
585
|
+
}
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
When `source` is provided, the parser becomes async-iterable — `for await` yields growing partial values, just like `createParser`:
|
|
589
|
+
|
|
590
|
+
```ts
|
|
591
|
+
const parser = createEventParser({ source: stream });
|
|
592
|
+
parser.on('tool', (e) => showToolUI(e.value));
|
|
593
|
+
|
|
594
|
+
for await (const partial of parser) {
|
|
595
|
+
updateUI(partial);
|
|
596
|
+
}
|
|
597
|
+
```
|
|
598
|
+
|
|
597
599
|
```ts
|
|
598
600
|
interface EventParser {
|
|
599
601
|
on(path: string, callback: (event: PathEvent) => void): EventParser;
|
|
600
602
|
on<T>(path: string, schema: { safeParse: Function }, callback: (event: PathEvent & { value: T }) => void): EventParser;
|
|
601
603
|
onDelta(path: string, callback: (event: DeltaEvent) => void): EventParser;
|
|
602
604
|
onText(callback: (text: string) => void): EventParser;
|
|
603
|
-
skip(...paths: string[]): EventParser;
|
|
604
605
|
off(path: string, callback?: Function): EventParser;
|
|
605
606
|
feed(chunk: string | Uint8Array): FeedStatus;
|
|
606
607
|
getValue(): unknown | undefined; // undefined while incomplete, throws on parse errors
|
|
@@ -608,10 +609,11 @@ interface EventParser {
|
|
|
608
609
|
getRawBuffer(): ArrayBuffer | null; // transferable buffer for Worker postMessage
|
|
609
610
|
getStatus(): FeedStatus;
|
|
610
611
|
destroy(): void;
|
|
612
|
+
[Symbol.asyncIterator](): AsyncIterableIterator<unknown | undefined>; // requires source
|
|
611
613
|
}
|
|
612
614
|
```
|
|
613
615
|
|
|
614
|
-
All methods return `self` for chaining: `parser.on(...).onDelta(...)
|
|
616
|
+
All methods return `self` for chaining: `parser.on(...).onDelta(...)`.
|
|
615
617
|
|
|
616
618
|
**Path syntax:**
|
|
617
619
|
- `foo.bar` — exact key
|
|
@@ -641,11 +643,47 @@ interface DeltaEvent {
|
|
|
641
643
|
length: number; // byte length of delta (raw bytes, not char count)
|
|
642
644
|
}
|
|
643
645
|
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
### Parser comparison
|
|
649
|
+
|
|
650
|
+
| | `createParser` | `createEventParser` |
|
|
651
|
+
|---|---|---|
|
|
652
|
+
| **Completion** | `feed()` returns `"complete"` after one JSON value | Handles multiple JSON values — user calls `destroy()` when done |
|
|
653
|
+
| **Malformed JSON** | `feed()` returns `"error"` | Skips it, finds the next JSON |
|
|
654
|
+
| **Schema** | Pass Zod/Valibot, only schema fields are parsed | Same |
|
|
655
|
+
| **Skip non-JSON** (think tags, code fences, prose) | — | Always |
|
|
656
|
+
| **Field subscriptions** | — | `on()`, `onDelta()` |
|
|
657
|
+
| **JSONL** | `format: "jsonl"` (planned) | `format: "jsonl"` (planned) |
|
|
658
|
+
| **Text callbacks** | — | `onText()` |
|
|
659
|
+
|
|
660
|
+
**`createParser` parses one JSON value** and reports status — you check it and react:
|
|
661
|
+
|
|
662
|
+
```js
|
|
663
|
+
const parser = createParser();
|
|
664
|
+
for await (const chunk of stream) {
|
|
665
|
+
const status = parser.feed(chunk);
|
|
666
|
+
if (status === "complete") break; // done — one JSON value parsed
|
|
667
|
+
if (status === "error") break; // malformed JSON detected
|
|
668
|
+
}
|
|
669
|
+
const result = parser.getValue();
|
|
670
|
+
parser.destroy();
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
**`createEventParser` handles an entire LLM response** — text, thinking, code fences, all in one stream:
|
|
674
|
+
|
|
675
|
+
```js
|
|
676
|
+
const parser = createEventParser();
|
|
677
|
+
parser.on('tool', (e) => showToolUI(e.value));
|
|
678
|
+
parser.onText((text) => thinkingPanel.append(text));
|
|
679
|
+
|
|
680
|
+
// LLM output with mixed content:
|
|
681
|
+
// <think>let me reason about this...</think>
|
|
682
|
+
// {"tool":"search","query":"weather"}
|
|
683
|
+
for await (const chunk of llmStream) {
|
|
684
|
+
parser.feed(chunk); // strips think tags, finds JSON, fires callbacks
|
|
648
685
|
}
|
|
686
|
+
parser.destroy();
|
|
649
687
|
```
|
|
650
688
|
|
|
651
689
|
### `deepCompare(a, b, options?): boolean`
|
package/dist/index.d.ts
CHANGED
|
@@ -55,8 +55,6 @@ export type ZodLike<T> = {
|
|
|
55
55
|
};
|
|
56
56
|
/** Options for createParser when using an options object. */
|
|
57
57
|
export interface CreateParserOptions<T = unknown> {
|
|
58
|
-
/** Only include these top-level or nested fields (dot-separated paths). */
|
|
59
|
-
pick?: string[];
|
|
60
58
|
/** Schema for validation on complete values. */
|
|
61
59
|
schema?: ZodLike<T>;
|
|
62
60
|
/** Stream source — makes the parser async-iterable via for-await. */
|
|
@@ -91,11 +89,6 @@ export interface DeltaEvent {
|
|
|
91
89
|
offset: number;
|
|
92
90
|
length: number;
|
|
93
91
|
}
|
|
94
|
-
export interface RootEvent {
|
|
95
|
-
type: 'root';
|
|
96
|
-
index: number;
|
|
97
|
-
value: unknown;
|
|
98
|
-
}
|
|
99
92
|
export interface EventParser {
|
|
100
93
|
on(path: string, callback: (event: PathEvent) => void): EventParser;
|
|
101
94
|
on<T>(path: string, schema: {
|
|
@@ -108,7 +101,6 @@ export interface EventParser {
|
|
|
108
101
|
}) => void): EventParser;
|
|
109
102
|
onDelta(path: string, callback: (event: DeltaEvent) => void): EventParser;
|
|
110
103
|
onText(callback: (text: string) => void): EventParser;
|
|
111
|
-
skip(...paths: string[]): EventParser;
|
|
112
104
|
off(path: string, callback?: Function): EventParser;
|
|
113
105
|
feed(chunk: string | Uint8Array): FeedStatus;
|
|
114
106
|
getValue(): unknown | undefined;
|
|
@@ -117,6 +109,8 @@ export interface EventParser {
|
|
|
117
109
|
/** Copy the accumulated stream buffer into a new ArrayBuffer (for Worker postMessage transfer). */
|
|
118
110
|
getRawBuffer(): ArrayBuffer | null;
|
|
119
111
|
destroy(): void;
|
|
112
|
+
/** Async iteration over partial values when a source was provided. */
|
|
113
|
+
[Symbol.asyncIterator](): AsyncIterableIterator<unknown | undefined>;
|
|
120
114
|
}
|
|
121
115
|
export interface VectorJSON {
|
|
122
116
|
/**
|
|
@@ -228,11 +222,16 @@ export interface VectorJSON {
|
|
|
228
222
|
}): PartialJsonResult<DeepPartial<T>>;
|
|
229
223
|
/**
|
|
230
224
|
* Create an event-driven streaming parser with path subscriptions,
|
|
231
|
-
* string delta emission,
|
|
225
|
+
* string delta emission, and JSON boundary detection.
|
|
232
226
|
*/
|
|
233
227
|
createEventParser(options?: {
|
|
234
|
-
|
|
235
|
-
|
|
228
|
+
source?: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array | string>;
|
|
229
|
+
schema?: {
|
|
230
|
+
safeParse: (v: unknown) => {
|
|
231
|
+
success: boolean;
|
|
232
|
+
data?: unknown;
|
|
233
|
+
};
|
|
234
|
+
};
|
|
236
235
|
}): EventParser;
|
|
237
236
|
}
|
|
238
237
|
/**
|
|
@@ -266,8 +265,13 @@ export declare const createParser: {
|
|
|
266
265
|
};
|
|
267
266
|
/** Create an event-driven streaming parser with path subscriptions. */
|
|
268
267
|
export declare const createEventParser: (options?: {
|
|
269
|
-
|
|
270
|
-
|
|
268
|
+
source?: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array | string>;
|
|
269
|
+
schema?: {
|
|
270
|
+
safeParse: (v: unknown) => {
|
|
271
|
+
success: boolean;
|
|
272
|
+
data?: unknown;
|
|
273
|
+
};
|
|
274
|
+
};
|
|
271
275
|
}) => EventParser;
|
|
272
276
|
/** Eagerly materialize a lazy proxy into plain JS objects. */
|
|
273
277
|
export declare const materialize: (value: unknown) => unknown;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/js/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAAC;AACnF,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,CAAC;AAE3E,oEAAoE;AACpE,MAAM,MAAM,gBAAgB,GACxB,kBAAkB,GAClB,gBAAgB,GAChB,cAAc,CAAC;AAEnB,yEAAyE;AACzE,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,OAAO,IACrC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,GACvC;IAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GACjD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC;AAEhD,sFAAsF;AACtF,MAAM,MAAM,WAAW,CAAC,CAAC,IACvB,CAAC,SAAS,MAAM,GACZ,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACtB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACrB;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACxC,CAAC,CAAC;AAER,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,uFAAuF;IACvF,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAC7C,qIAAqI;IACrI,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,IAAI,UAAU,GAAG,IAAI,CAAC;IAClC,mDAAmD;IACnD,SAAS,IAAI,UAAU,CAAC;IACxB,mGAAmG;IACnG,YAAY,IAAI,WAAW,GAAG,IAAI,CAAC;IACnC,iDAAiD;IACjD,OAAO,IAAI,IAAI,CAAC;IAChB,sEAAsE;IACtE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,qBAAqB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;CAChE;AAED,qDAAqD;AACrD,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IAAE,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AAEvF,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/js/index.ts"],"names":[],"mappings":"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"}
|