unclosed 1.0.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,19 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. This project follows
4
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5
+
6
+ ## [1.0.0]
7
+
8
+ First stable release. The public API is now frozen; future releases will be
9
+ bug fixes and compatibility updates only.
10
+
11
+ ### Added
12
+
13
+ - `parse`, `parseWithMeta`, `tryParse`, `isComplete`, `repair`, `scanToJson`
14
+ - `PartialJson` accumulator and `parseStream` async generator
15
+ - `UnclosedError` for malformed (as opposed to unfinished) input
16
+ - Options: `partialStrings`, `partialLiterals`, `scan`, `onlyOnChange`
17
+ - Tolerance for trailing commas, comments, single quotes and Markdown fences
18
+ - Dual ESM/CommonJS builds with bundled type declarations
19
+ - Python port with a matching API and test suite
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 unclosed contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,136 @@
1
+ # unclosed
2
+
3
+ **Parse JSON that hasn't finished arriving yet.**
4
+
5
+ When a model streams JSON token by token, every intermediate buffer is invalid
6
+ JSON. `JSON.parse` throws on all of them, so you either wait for the last token
7
+ or hand-roll a brace counter. `unclosed` reads whatever has arrived and closes
8
+ what is still open, so you can render as it streams.
9
+
10
+ ```
11
+ {"title": "Quarterly rep -> { title: "Quarterly rep" }
12
+ {"items": [1, 2, 3 -> { items: [1, 2, 3] }
13
+ {"ok": tr -> { ok: true }
14
+ ```
15
+
16
+ - **Zero dependencies.** Nothing to audit, nothing to update.
17
+ - **~9 kB, no build step required.** ESM, CommonJS and types included.
18
+ - **Never invents data.** A truncated key, a half-written `\u00e` escape or an
19
+ unrecoverable number is dropped, not guessed.
20
+ - **Frozen API.** JSON is a finished spec. This library is finished too.
21
+
22
+ ## Install
23
+
24
+ ```sh
25
+ npm install unclosed
26
+ ```
27
+
28
+ Also available for Python: `pip install unclosed` (see [`python/`](./python)).
29
+
30
+ ## Use
31
+
32
+ ### One-shot
33
+
34
+ ```ts
35
+ import { parse } from "unclosed"
36
+
37
+ parse('{"user":{"name":"Ada","tags":["math"')
38
+ // => { user: { name: "Ada", tags: ["math"] } }
39
+ ```
40
+
41
+ ### Streaming
42
+
43
+ ```ts
44
+ import { parseStream } from "unclosed"
45
+
46
+ for await (const { value, complete } of parseStream(tokens)) {
47
+ render(value)
48
+ if (complete) save(value)
49
+ }
50
+ ```
51
+
52
+ Or drive it yourself:
53
+
54
+ ```ts
55
+ import { PartialJson } from "unclosed"
56
+
57
+ const acc = new PartialJson()
58
+ for await (const chunk of tokens) {
59
+ const { value, complete } = acc.push(chunk)
60
+ render(value)
61
+ }
62
+ ```
63
+
64
+ ### Knowing what is final
65
+
66
+ A field that is still being written should usually not be treated as final.
67
+ `incompletePath` points at it.
68
+
69
+ ```ts
70
+ import { parseWithMeta } from "unclosed"
71
+
72
+ parseWithMeta('{"a":{"b":[1,"xy')
73
+ // {
74
+ // value: { a: { b: [1, "xy"] } },
75
+ // complete: false,
76
+ // incompletePath: ["a", "b", 1],
77
+ // }
78
+ ```
79
+
80
+ ## API
81
+
82
+ | Function | Description |
83
+ | --- | --- |
84
+ | `parse(text, options?)` | Best-effort value, or `undefined` if nothing is recoverable. |
85
+ | `parseWithMeta(text, options?)` | `{ value, complete, incompletePath }`. |
86
+ | `tryParse(text, options?)` | Like `parse`, but returns `undefined` instead of throwing. |
87
+ | `isComplete(text, options?)` | `true` when the input holds one whole JSON value. |
88
+ | `repair(text, options?)` | Returns a valid JSON string. |
89
+ | `PartialJson` | Accumulator with `push`, `value`, `complete`, `reset`. |
90
+ | `parseStream(source, options?)` | Async generator of snapshots. |
91
+ | `scanToJson(text)` | Strips prose and Markdown fences. |
92
+ | `UnclosedError` | Thrown for malformed (not merely unfinished) input. |
93
+
94
+ ### Options
95
+
96
+ | Option | Default | Description |
97
+ | --- | --- | --- |
98
+ | `partialStrings` | `true` | Keep the received prefix of an unterminated string. |
99
+ | `partialLiterals` | `true` | Resolve `tru` to `true`, `nul` to `null`. |
100
+ | `scan` | `true` | Skip Markdown fences and prose before the first `{` or `[`. |
101
+ | `onlyOnChange` | `true` | `parseStream` only: skip chunks that changed nothing. |
102
+
103
+ ## Guarantees
104
+
105
+ These are covered by tests that walk every prefix of a document:
106
+
107
+ 1. **No throw on truncation.** Any prefix of valid JSON parses without error.
108
+ 2. **Subset property.** The value recovered from a prefix is always a subset of
109
+ the final value: no extra keys, no extra array items, and every string is a
110
+ prefix of its final form.
111
+ 3. **Idempotent output.** `repair()` always returns something `JSON.parse` accepts.
112
+ 4. **Chunk-boundary independence.** Where the stream is split never affects the result.
113
+
114
+ ## Tolerances
115
+
116
+ Beyond truncation, real model output drifts from the spec in a few predictable
117
+ ways. These are accepted and will not change:
118
+
119
+ - trailing commas: `{"a":1,}`
120
+ - `//` and `/* */` comments
121
+ - single-quoted strings: `{'a':'b'}`
122
+ - Markdown fences and surrounding prose
123
+
124
+ Anything else, such as unquoted keys or `NaN`, throws `UnclosedError`. This
125
+ library completes JSON; it does not rewrite other formats into it.
126
+
127
+ ## Performance
128
+
129
+ The parser is a single pass with no allocation beyond the result. The streaming
130
+ helpers re-parse the buffer per chunk, which is `O(n²)` over the whole stream and
131
+ is the right trade for model-sized payloads, where `n` is kilobytes. For
132
+ multi-megabyte streams, call `parse` on a timer instead of on every token.
133
+
134
+ ## License
135
+
136
+ MIT
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * unclosed — parse JSON that has not finished arriving yet.
4
+ *
5
+ * Zero dependencies, one job, frozen API.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.parseStream = exports.PartialJson = exports.UnclosedError = exports.scanToJson = exports.repair = exports.isComplete = exports.tryParse = exports.parseWithMeta = exports.parse = void 0;
9
+ var parse_js_1 = require("./parse.js");
10
+ Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return parse_js_1.parse; } });
11
+ Object.defineProperty(exports, "parseWithMeta", { enumerable: true, get: function () { return parse_js_1.parseWithMeta; } });
12
+ Object.defineProperty(exports, "tryParse", { enumerable: true, get: function () { return parse_js_1.tryParse; } });
13
+ Object.defineProperty(exports, "isComplete", { enumerable: true, get: function () { return parse_js_1.isComplete; } });
14
+ Object.defineProperty(exports, "repair", { enumerable: true, get: function () { return parse_js_1.repair; } });
15
+ Object.defineProperty(exports, "scanToJson", { enumerable: true, get: function () { return parse_js_1.scanToJson; } });
16
+ Object.defineProperty(exports, "UnclosedError", { enumerable: true, get: function () { return parse_js_1.UnclosedError; } });
17
+ var stream_js_1 = require("./stream.js");
18
+ Object.defineProperty(exports, "PartialJson", { enumerable: true, get: function () { return stream_js_1.PartialJson; } });
19
+ Object.defineProperty(exports, "parseStream", { enumerable: true, get: function () { return stream_js_1.parseStream; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,uCAQmB;AAPlB,iGAAA,KAAK,OAAA;AACL,yGAAA,aAAa,OAAA;AACb,oGAAA,QAAQ,OAAA;AACR,sGAAA,UAAU,OAAA;AACV,kGAAA,MAAM,OAAA;AACN,sGAAA,UAAU,OAAA;AACV,yGAAA,aAAa,OAAA;AAKd,yCAAsD;AAA7C,wGAAA,WAAW,OAAA;AAAE,wGAAA,WAAW,OAAA"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,377 @@
1
+ "use strict";
2
+ /**
3
+ * Tolerant JSON parser for incomplete ("unclosed") input.
4
+ *
5
+ * The parser reads as much of a JSON document as is present and closes any
6
+ * containers that were still open when the input ended. It never guesses at
7
+ * data it has not seen: a truncated object key, a half-written escape sequence
8
+ * or an unrecoverable number is dropped rather than invented.
9
+ *
10
+ * Zero dependencies. No configuration files. No runtime requirements beyond
11
+ * ES2020.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.UnclosedError = void 0;
15
+ exports.scanToJson = scanToJson;
16
+ exports.parseWithMeta = parseWithMeta;
17
+ exports.parse = parse;
18
+ exports.tryParse = tryParse;
19
+ exports.isComplete = isComplete;
20
+ exports.repair = repair;
21
+ /** Thrown for input that is malformed rather than merely unfinished. */
22
+ class UnclosedError extends SyntaxError {
23
+ constructor(message, position) {
24
+ super(`${message} (at position ${position})`);
25
+ this.name = "UnclosedError";
26
+ this.position = position;
27
+ }
28
+ }
29
+ exports.UnclosedError = UnclosedError;
30
+ const MISSING = Symbol("unclosed.missing");
31
+ const DEFAULTS = {
32
+ partialStrings: true,
33
+ partialLiterals: true,
34
+ scan: true,
35
+ };
36
+ const LITERALS = [
37
+ ["true", true],
38
+ ["false", false],
39
+ ["null", null],
40
+ ];
41
+ function isDigit(c) {
42
+ return c >= "0" && c <= "9";
43
+ }
44
+ function isHex(s) {
45
+ for (let i = 0; i < s.length; i++) {
46
+ const c = s[i].toLowerCase();
47
+ if (!(isDigit(c) || (c >= "a" && c <= "f")))
48
+ return false;
49
+ }
50
+ return true;
51
+ }
52
+ /**
53
+ * Strip Markdown fences and leading prose so that model output such as
54
+ * "Sure! ```json\n{..." parses without pre-processing on the caller's side.
55
+ */
56
+ function scanToJson(input) {
57
+ let text = input;
58
+ const fence = /```[A-Za-z0-9_-]*[ \t]*\r?\n?/.exec(text);
59
+ if (fence) {
60
+ text = text.slice(fence.index + fence[0].length);
61
+ const close = text.indexOf("```");
62
+ if (close !== -1)
63
+ text = text.slice(0, close);
64
+ }
65
+ const start = text.search(/[[{]/);
66
+ if (start > 0)
67
+ text = text.slice(start);
68
+ return text;
69
+ }
70
+ class Parser {
71
+ constructor(src, opts) {
72
+ this.pos = 0;
73
+ this.path = [];
74
+ this.complete = true;
75
+ this.incompletePath = null;
76
+ this.src = src;
77
+ this.opts = opts;
78
+ }
79
+ get atEnd() {
80
+ return this.pos >= this.src.length;
81
+ }
82
+ /** Record that input ran out while reading the current node. */
83
+ truncated() {
84
+ if (this.complete) {
85
+ this.complete = false;
86
+ this.incompletePath = this.path.slice();
87
+ }
88
+ this.pos = this.src.length;
89
+ }
90
+ fail(message) {
91
+ throw new UnclosedError(message, this.pos);
92
+ }
93
+ /** Whitespace, plus `//` and block comments, which models emit often. */
94
+ skip() {
95
+ const s = this.src;
96
+ while (this.pos < s.length) {
97
+ const c = s[this.pos];
98
+ if (c === " " || c === "\n" || c === "\r" || c === "\t" || c === "\uFEFF") {
99
+ this.pos++;
100
+ continue;
101
+ }
102
+ if (c === "/" && s[this.pos + 1] === "/") {
103
+ this.pos += 2;
104
+ while (this.pos < s.length && s[this.pos] !== "\n")
105
+ this.pos++;
106
+ continue;
107
+ }
108
+ if (c === "/" && s[this.pos + 1] === "*") {
109
+ this.pos += 2;
110
+ while (this.pos < s.length &&
111
+ !(s[this.pos] === "*" && s[this.pos + 1] === "/")) {
112
+ this.pos++;
113
+ }
114
+ this.pos = Math.min(this.pos + 2, s.length);
115
+ continue;
116
+ }
117
+ break;
118
+ }
119
+ }
120
+ parse() {
121
+ const value = this.value();
122
+ return value;
123
+ }
124
+ value() {
125
+ this.skip();
126
+ if (this.atEnd) {
127
+ this.truncated();
128
+ return MISSING;
129
+ }
130
+ const c = this.src[this.pos];
131
+ if (c === "{")
132
+ return this.object();
133
+ if (c === "[")
134
+ return this.array();
135
+ if (c === '"' || c === "'")
136
+ return this.string(c);
137
+ if (c === "-" || c === "+" || isDigit(c))
138
+ return this.number();
139
+ if (/[A-Za-z]/.test(c))
140
+ return this.literal();
141
+ return this.fail(`Unexpected character ${JSON.stringify(c)}`);
142
+ }
143
+ object() {
144
+ this.pos++;
145
+ const out = {};
146
+ for (;;) {
147
+ this.skip();
148
+ if (this.atEnd) {
149
+ this.truncated();
150
+ return out;
151
+ }
152
+ const c = this.src[this.pos];
153
+ if (c === "}") {
154
+ this.pos++;
155
+ return out;
156
+ }
157
+ if (c === ",") {
158
+ this.pos++;
159
+ continue;
160
+ }
161
+ if (c !== '"' && c !== "'") {
162
+ return this.fail(`Expected a key but found ${JSON.stringify(c)}`);
163
+ }
164
+ const key = this.string(c);
165
+ // A key that is still being written tells us nothing about its value.
166
+ if (key === MISSING || !this.complete)
167
+ return out;
168
+ this.skip();
169
+ if (this.atEnd) {
170
+ this.truncated();
171
+ return out;
172
+ }
173
+ const sep = this.src[this.pos];
174
+ if (sep === ":") {
175
+ this.pos++;
176
+ }
177
+ else if (sep === "," || sep === "}") {
178
+ continue;
179
+ }
180
+ else {
181
+ return this.fail(`Expected ':' but found ${JSON.stringify(sep)}`);
182
+ }
183
+ this.skip();
184
+ if (this.atEnd) {
185
+ this.truncated();
186
+ return out;
187
+ }
188
+ this.path.push(key);
189
+ const value = this.value();
190
+ this.path.pop();
191
+ if (value === MISSING)
192
+ return out;
193
+ out[key] = value;
194
+ }
195
+ }
196
+ array() {
197
+ this.pos++;
198
+ const out = [];
199
+ for (;;) {
200
+ this.skip();
201
+ if (this.atEnd) {
202
+ this.truncated();
203
+ return out;
204
+ }
205
+ const c = this.src[this.pos];
206
+ if (c === "]") {
207
+ this.pos++;
208
+ return out;
209
+ }
210
+ if (c === ",") {
211
+ this.pos++;
212
+ continue;
213
+ }
214
+ this.path.push(out.length);
215
+ const value = this.value();
216
+ this.path.pop();
217
+ if (value === MISSING)
218
+ return out;
219
+ out.push(value);
220
+ }
221
+ }
222
+ string(quote) {
223
+ const s = this.src;
224
+ this.pos++;
225
+ let out = "";
226
+ while (this.pos < s.length) {
227
+ const c = s[this.pos];
228
+ if (c === quote) {
229
+ this.pos++;
230
+ return out;
231
+ }
232
+ if (c !== "\\") {
233
+ out += c;
234
+ this.pos++;
235
+ continue;
236
+ }
237
+ // Escape sequence. If it is cut in half, drop it and stop here so we
238
+ // never emit a character the sender did not finish writing.
239
+ if (this.pos + 1 >= s.length)
240
+ return this.unterminated(out);
241
+ const esc = s[this.pos + 1];
242
+ if (esc === "u") {
243
+ const hex = s.slice(this.pos + 2, this.pos + 6);
244
+ if (hex.length < 4)
245
+ return this.unterminated(out);
246
+ if (!isHex(hex)) {
247
+ this.pos += 1;
248
+ return this.fail(`Invalid unicode escape \\u${hex}`);
249
+ }
250
+ out += String.fromCharCode(parseInt(hex, 16));
251
+ this.pos += 6;
252
+ continue;
253
+ }
254
+ const simple = SIMPLE_ESCAPES[esc];
255
+ if (simple === undefined) {
256
+ this.pos += 1;
257
+ return this.fail(`Invalid escape \\${esc}`);
258
+ }
259
+ out += simple;
260
+ this.pos += 2;
261
+ }
262
+ return this.unterminated(out);
263
+ }
264
+ unterminated(sofar) {
265
+ this.truncated();
266
+ return this.opts.partialStrings ? sofar : MISSING;
267
+ }
268
+ number() {
269
+ const s = this.src;
270
+ const start = this.pos;
271
+ if (s[this.pos] === "-" || s[this.pos] === "+")
272
+ this.pos++;
273
+ while (this.pos < s.length && isDigit(s[this.pos]))
274
+ this.pos++;
275
+ if (s[this.pos] === ".") {
276
+ this.pos++;
277
+ while (this.pos < s.length && isDigit(s[this.pos]))
278
+ this.pos++;
279
+ }
280
+ if (s[this.pos] === "e" || s[this.pos] === "E") {
281
+ this.pos++;
282
+ if (s[this.pos] === "+" || s[this.pos] === "-")
283
+ this.pos++;
284
+ while (this.pos < s.length && isDigit(s[this.pos]))
285
+ this.pos++;
286
+ }
287
+ let raw = s.slice(start, this.pos);
288
+ if (this.atEnd) {
289
+ // A number touching the end of the buffer may still be growing.
290
+ this.truncated();
291
+ raw = raw.replace(/[.eE][+-]?$/, "").replace(/[.eE]$/, "");
292
+ }
293
+ if (!/^[+-]?[0-9]/.test(raw))
294
+ return MISSING;
295
+ const n = Number(raw);
296
+ return Number.isFinite(n) ? n : MISSING;
297
+ }
298
+ literal() {
299
+ const rest = this.src.slice(this.pos);
300
+ for (const [word, value] of LITERALS) {
301
+ if (rest.startsWith(word)) {
302
+ this.pos += word.length;
303
+ return value;
304
+ }
305
+ if (rest.length > 0 && word.startsWith(rest)) {
306
+ this.truncated();
307
+ return this.opts.partialLiterals ? value : MISSING;
308
+ }
309
+ }
310
+ return this.fail(`Unexpected token ${JSON.stringify(rest.slice(0, 8))}`);
311
+ }
312
+ }
313
+ const SIMPLE_ESCAPES = {
314
+ '"': '"',
315
+ "'": "'",
316
+ "\\": "\\",
317
+ "/": "/",
318
+ b: "\b",
319
+ f: "\f",
320
+ n: "\n",
321
+ r: "\r",
322
+ t: "\t",
323
+ };
324
+ /**
325
+ * Parse possibly-incomplete JSON and report how much of it is final.
326
+ *
327
+ * @throws {UnclosedError} when the input is malformed rather than unfinished.
328
+ */
329
+ function parseWithMeta(input, options = {}) {
330
+ const opts = { ...DEFAULTS, ...options };
331
+ const text = opts.scan ? scanToJson(input) : input;
332
+ const parser = new Parser(text, opts);
333
+ const value = parser.parse();
334
+ return {
335
+ value: value === MISSING ? undefined : value,
336
+ complete: parser.complete,
337
+ incompletePath: parser.incompletePath,
338
+ };
339
+ }
340
+ /**
341
+ * Parse possibly-incomplete JSON.
342
+ *
343
+ * Returns `undefined` when no value could be recovered at all.
344
+ *
345
+ * @throws {UnclosedError} when the input is malformed rather than unfinished.
346
+ */
347
+ function parse(input, options) {
348
+ return parseWithMeta(input, options).value;
349
+ }
350
+ /** Parse without throwing. Returns `undefined` on malformed input. */
351
+ function tryParse(input, options) {
352
+ try {
353
+ return parse(input, options);
354
+ }
355
+ catch {
356
+ return undefined;
357
+ }
358
+ }
359
+ /** `true` when the input holds one whole, untruncated JSON value. */
360
+ function isComplete(input, options) {
361
+ try {
362
+ return parseWithMeta(input, options).complete;
363
+ }
364
+ catch {
365
+ return false;
366
+ }
367
+ }
368
+ /**
369
+ * Turn possibly-incomplete JSON into a valid JSON string.
370
+ *
371
+ * @throws {UnclosedError} when the input is malformed rather than unfinished.
372
+ */
373
+ function repair(input, options) {
374
+ const { value } = parseWithMeta(input, options);
375
+ return JSON.stringify(value === undefined ? null : value);
376
+ }
377
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"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"}