@wavehouse/chtypes 0.1.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 +24 -0
- package/LICENSE +202 -0
- package/README.md +442 -0
- package/dist/cli.d.ts +43 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +303 -0
- package/dist/cli.js.map +1 -0
- package/dist/discover.d.ts +134 -0
- package/dist/discover.d.ts.map +1 -0
- package/dist/discover.js +291 -0
- package/dist/discover.js.map +1 -0
- package/dist/errors.d.ts +204 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +228 -0
- package/dist/errors.js.map +1 -0
- package/dist/fetch.d.ts +235 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +842 -0
- package/dist/fetch.js.map +1 -0
- package/dist/ffi.d.ts +346 -0
- package/dist/ffi.d.ts.map +1 -0
- package/dist/ffi.js +913 -0
- package/dist/ffi.js.map +1 -0
- package/dist/format.d.ts +104 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +108 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +127 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +577 -0
- package/dist/json.js.map +1 -0
- package/dist/library.d.ts +225 -0
- package/dist/library.d.ts.map +1 -0
- package/dist/library.js +234 -0
- package/dist/library.js.map +1 -0
- package/dist/numeric.d.ts +20 -0
- package/dist/numeric.d.ts.map +1 -0
- package/dist/numeric.js +107 -0
- package/dist/numeric.js.map +1 -0
- package/dist/paths.d.ts +47 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +78 -0
- package/dist/paths.js.map +1 -0
- package/dist/registry.d.ts +204 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +409 -0
- package/dist/registry.js.map +1 -0
- package/dist/results.d.ts +326 -0
- package/dist/results.d.ts.map +1 -0
- package/dist/results.js +235 -0
- package/dist/results.js.map +1 -0
- package/dist/schema.d.ts +444 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +448 -0
- package/dist/schema.js.map +1 -0
- package/dist/settings.d.ts +43 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +33 -0
- package/dist/settings.js.map +1 -0
- package/dist/tar.d.ts +32 -0
- package/dist/tar.d.ts.map +1 -0
- package/dist/tar.js +310 -0
- package/dist/tar.js.map +1 -0
- package/dist/transform.d.ts +73 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +527 -0
- package/dist/transform.js.map +1 -0
- package/package.json +62 -0
package/dist/json.js
ADDED
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result-document JSON, **over bytes**, with three obligations no `JSON.parse`
|
|
3
|
+
* can meet.
|
|
4
|
+
*
|
|
5
|
+
* 1. **The bytes are the answer.** A ClickHouse `String`, `FixedString` or
|
|
6
|
+
* `AggregateFunction` value holds arbitrary bytes, and the library emits them
|
|
7
|
+
* into the result document verbatim (`writeJSONString` escapes the control
|
|
8
|
+
* bytes and passes everything else through). Decoding that document into a JS
|
|
9
|
+
* string replaces every invalid byte with U+FFFD, which then reads downstream
|
|
10
|
+
* as a silent transformation that never happened — an *invented* answer, the
|
|
11
|
+
* failure mode this product exists to prevent (spec/c-abi.md §Per-column
|
|
12
|
+
* fields: "`stored` and `ref` MUST be handled as raw bytes / raw JSON"; the
|
|
13
|
+
* reference implementation keeps `json.RawMessage`). So the document is parsed
|
|
14
|
+
* from a `Buffer`, and every value remembers the exact slice it was cut from.
|
|
15
|
+
*
|
|
16
|
+
* 2. **Numbers must keep their exact text.** ClickHouse integers go to 2^256.
|
|
17
|
+
* `JSON.parse` turns 18446744073709551615 into 18446744073709552000 and an
|
|
18
|
+
* Int256 into -5.78960446186581e+76 — a value difference no scorer can tell
|
|
19
|
+
* from a real coercion defect. A number is never converted here: it *is* its
|
|
20
|
+
* own source bytes.
|
|
21
|
+
*
|
|
22
|
+
* 3. **Duplicate keys and escape spellings survive.** ClickHouse can store a
|
|
23
|
+
* `Map` with a repeated key (`{"a":1,"a":2}`), and it writes the escape
|
|
24
|
+
* `\\u000B` where a JS re-serialisation writes `\\u000b`. `JSON.parse` collapses
|
|
25
|
+
* the first and loses the second, and either reports bytes the table does not
|
|
26
|
+
* hold.
|
|
27
|
+
* Object members are therefore kept as an ordered key/value list, and nothing
|
|
28
|
+
* is ever re-rendered: `rawBytes` hands back the library's own slice.
|
|
29
|
+
*
|
|
30
|
+
* The bare-denormal repair is the one edit made to the bytes, and it is
|
|
31
|
+
* required, not optional: ClickHouse's `serializeTextJSON` writes IEEE denormals
|
|
32
|
+
* as the bare tokens `inf`, `-inf` and `nan` unless
|
|
33
|
+
* `output_format_json_quote_denormals` is set. That is faithful ClickHouse
|
|
34
|
+
* output and it is not valid JSON — one QBit column full of infinities took an
|
|
35
|
+
* entire result document down and cost 18 arbiter cases at once.
|
|
36
|
+
* `repairBareDenormals` is the port of `quoteBareDenormals`
|
|
37
|
+
* (go/chtypes/chtypes.go): it quotes the token and changes nothing
|
|
38
|
+
* else, and it runs before any slice is cut, so the reference implementation and
|
|
39
|
+
* this one end up holding the same bytes.
|
|
40
|
+
*/
|
|
41
|
+
import { isUtf8 } from 'node:buffer';
|
|
42
|
+
import { ChtypesError } from './errors.js';
|
|
43
|
+
const EMPTY = Buffer.alloc(0);
|
|
44
|
+
const NO_ITEMS = [];
|
|
45
|
+
const NO_KEYS = [];
|
|
46
|
+
/**
|
|
47
|
+
* One parsed JSON value that still knows the exact bytes it came from.
|
|
48
|
+
*
|
|
49
|
+
* `raw` is the equivalent of Go's `json.RawMessage` — the verbatim source slice,
|
|
50
|
+
* which is what any re-rendering of a stored value must use. `bytes` is a
|
|
51
|
+
* scalar's own value: a string's **unescaped** bytes, or a number's / literal's
|
|
52
|
+
* text. A container carries its members in `items` and, for an object, the
|
|
53
|
+
* matching unescaped `keys` — **duplicates included, in source order**.
|
|
54
|
+
*/
|
|
55
|
+
export class Json {
|
|
56
|
+
kind;
|
|
57
|
+
raw;
|
|
58
|
+
bytes;
|
|
59
|
+
items;
|
|
60
|
+
keys;
|
|
61
|
+
constructor(kind, raw, bytes = EMPTY, items = NO_ITEMS, keys = NO_KEYS) {
|
|
62
|
+
this.kind = kind;
|
|
63
|
+
this.raw = raw;
|
|
64
|
+
this.bytes = bytes;
|
|
65
|
+
this.items = items;
|
|
66
|
+
this.keys = keys;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** True when these bytes are valid UTF-8 — i.e. when their text is exact. */
|
|
70
|
+
export function isValidUtf8(bytes) {
|
|
71
|
+
return isUtf8(bytes);
|
|
72
|
+
}
|
|
73
|
+
// ------------------------------------------------------------------- the parser
|
|
74
|
+
const TAB = 0x09;
|
|
75
|
+
const LF = 0x0a;
|
|
76
|
+
const CR = 0x0d;
|
|
77
|
+
const SPACE = 0x20;
|
|
78
|
+
const QUOTE = 0x22;
|
|
79
|
+
const PLUS = 0x2b;
|
|
80
|
+
const COMMA = 0x2c;
|
|
81
|
+
const MINUS = 0x2d;
|
|
82
|
+
const DOT = 0x2e;
|
|
83
|
+
const SLASH = 0x2f;
|
|
84
|
+
const ZERO = 0x30;
|
|
85
|
+
const NINE = 0x39;
|
|
86
|
+
const COLON = 0x3a;
|
|
87
|
+
const UPPER_E = 0x45;
|
|
88
|
+
const ARRAY_OPEN = 0x5b;
|
|
89
|
+
const BACKSLASH = 0x5c;
|
|
90
|
+
const ARRAY_CLOSE = 0x5d;
|
|
91
|
+
const LOWER_B = 0x62;
|
|
92
|
+
const LOWER_E = 0x65;
|
|
93
|
+
const LOWER_F = 0x66;
|
|
94
|
+
const LOWER_N = 0x6e;
|
|
95
|
+
const LOWER_R = 0x72;
|
|
96
|
+
const LOWER_T = 0x74;
|
|
97
|
+
const LOWER_U = 0x75;
|
|
98
|
+
const OBJECT_OPEN = 0x7b;
|
|
99
|
+
const OBJECT_CLOSE = 0x7d;
|
|
100
|
+
const BACKSPACE = 0x08;
|
|
101
|
+
const FORM_FEED = 0x0c;
|
|
102
|
+
/** JSON's whitespace is exactly these four bytes — see `parseJsonValue`. */
|
|
103
|
+
function isSpace(c) {
|
|
104
|
+
return c === SPACE || c === TAB || c === LF || c === CR;
|
|
105
|
+
}
|
|
106
|
+
function isDigit(c) {
|
|
107
|
+
return c >= ZERO && c <= NINE;
|
|
108
|
+
}
|
|
109
|
+
/** U+FFFD, the only byte sequence this module ever substitutes. */
|
|
110
|
+
const REPLACEMENT = [0xef, 0xbf, 0xbd];
|
|
111
|
+
class Parser {
|
|
112
|
+
b;
|
|
113
|
+
i = 0;
|
|
114
|
+
constructor(b) {
|
|
115
|
+
this.b = b;
|
|
116
|
+
}
|
|
117
|
+
fail(what) {
|
|
118
|
+
throw new ChtypesError(`chtypes: bad result document: ${what} at offset ${this.i}`);
|
|
119
|
+
}
|
|
120
|
+
skipSpace() {
|
|
121
|
+
while (this.i < this.b.length && isSpace(this.b[this.i]))
|
|
122
|
+
this.i++;
|
|
123
|
+
}
|
|
124
|
+
atEnd() {
|
|
125
|
+
return this.i >= this.b.length;
|
|
126
|
+
}
|
|
127
|
+
/** Parse one value, leaving the cursor just past it. */
|
|
128
|
+
value() {
|
|
129
|
+
this.skipSpace();
|
|
130
|
+
if (this.atEnd())
|
|
131
|
+
this.fail('unexpected end of document');
|
|
132
|
+
const c = this.b[this.i];
|
|
133
|
+
switch (c) {
|
|
134
|
+
case OBJECT_OPEN:
|
|
135
|
+
return this.object();
|
|
136
|
+
case ARRAY_OPEN:
|
|
137
|
+
return this.array();
|
|
138
|
+
case QUOTE:
|
|
139
|
+
return this.string();
|
|
140
|
+
case LOWER_T:
|
|
141
|
+
return this.literal('true', 'bool');
|
|
142
|
+
case LOWER_F:
|
|
143
|
+
return this.literal('false', 'bool');
|
|
144
|
+
case LOWER_N:
|
|
145
|
+
return this.literal('null', 'null');
|
|
146
|
+
default:
|
|
147
|
+
if (c === MINUS || isDigit(c))
|
|
148
|
+
return this.number();
|
|
149
|
+
return this.fail(`unexpected byte 0x${c.toString(16)}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
literal(word, kind) {
|
|
153
|
+
const start = this.i;
|
|
154
|
+
for (let k = 0; k < word.length; k++) {
|
|
155
|
+
if (this.b[this.i + k] !== word.charCodeAt(k))
|
|
156
|
+
this.fail(`expected ${word}`);
|
|
157
|
+
}
|
|
158
|
+
this.i += word.length;
|
|
159
|
+
const raw = this.b.subarray(start, this.i);
|
|
160
|
+
return new Json(kind, raw, raw);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* A JSON number, strictly: no leading `+`, no bare `.5`, no `1.`, no leading
|
|
164
|
+
* zeros. The strictness is load-bearing rather than pedantic — `parseJsonValue`
|
|
165
|
+
* decides with this grammar whether a supplied CSV/TSV field *is* a JSON
|
|
166
|
+
* value, and a lenient reading invents transformations (spec/bindings.md
|
|
167
|
+
* §detectors).
|
|
168
|
+
*/
|
|
169
|
+
number() {
|
|
170
|
+
const start = this.i;
|
|
171
|
+
if (this.b[this.i] === MINUS)
|
|
172
|
+
this.i++;
|
|
173
|
+
if (this.atEnd() || !isDigit(this.b[this.i]))
|
|
174
|
+
this.fail('expected a digit');
|
|
175
|
+
if (this.b[this.i] === ZERO) {
|
|
176
|
+
this.i++;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
while (!this.atEnd() && isDigit(this.b[this.i]))
|
|
180
|
+
this.i++;
|
|
181
|
+
}
|
|
182
|
+
if (this.b[this.i] === DOT) {
|
|
183
|
+
this.i++;
|
|
184
|
+
if (this.atEnd() || !isDigit(this.b[this.i]))
|
|
185
|
+
this.fail('expected a digit after the decimal point');
|
|
186
|
+
while (!this.atEnd() && isDigit(this.b[this.i]))
|
|
187
|
+
this.i++;
|
|
188
|
+
}
|
|
189
|
+
if (this.b[this.i] === LOWER_E || this.b[this.i] === UPPER_E) {
|
|
190
|
+
this.i++;
|
|
191
|
+
if (this.b[this.i] === PLUS || this.b[this.i] === MINUS)
|
|
192
|
+
this.i++;
|
|
193
|
+
if (this.atEnd() || !isDigit(this.b[this.i]))
|
|
194
|
+
this.fail('expected a digit in the exponent');
|
|
195
|
+
while (!this.atEnd() && isDigit(this.b[this.i]))
|
|
196
|
+
this.i++;
|
|
197
|
+
}
|
|
198
|
+
const raw = this.b.subarray(start, this.i);
|
|
199
|
+
return new Json('number', raw, raw);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* A JSON string. Its unescaped bytes are a slice of the source when it holds no
|
|
203
|
+
* escape (the common case) and are assembled byte by byte when it does — never
|
|
204
|
+
* through a JS string, so a `String` column's invalid UTF-8 crosses intact.
|
|
205
|
+
*/
|
|
206
|
+
string() {
|
|
207
|
+
const start = this.i;
|
|
208
|
+
this.i++; // the opening quote
|
|
209
|
+
let escaped = false;
|
|
210
|
+
for (;;) {
|
|
211
|
+
if (this.atEnd())
|
|
212
|
+
this.fail('unterminated string');
|
|
213
|
+
const c = this.b[this.i];
|
|
214
|
+
if (c === BACKSLASH) {
|
|
215
|
+
escaped = true;
|
|
216
|
+
this.i += 2;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (c === QUOTE)
|
|
220
|
+
break;
|
|
221
|
+
// A raw control byte is not JSON, and ClickHouse escapes every one of
|
|
222
|
+
// them, so meeting one means this is not the document promised here.
|
|
223
|
+
if (c < SPACE)
|
|
224
|
+
this.fail(`raw control byte 0x${c.toString(16)} in a string`);
|
|
225
|
+
this.i++;
|
|
226
|
+
}
|
|
227
|
+
const inner = this.b.subarray(start + 1, this.i);
|
|
228
|
+
this.i++; // the closing quote
|
|
229
|
+
const raw = this.b.subarray(start, this.i);
|
|
230
|
+
return new Json('string', raw, escaped ? this.unescape(inner) : inner);
|
|
231
|
+
}
|
|
232
|
+
/** Resolve the escapes in a string body. Bytes in, bytes out. */
|
|
233
|
+
unescape(inner) {
|
|
234
|
+
const out = [];
|
|
235
|
+
for (let i = 0; i < inner.length; i++) {
|
|
236
|
+
const c = inner[i];
|
|
237
|
+
if (c !== BACKSLASH) {
|
|
238
|
+
out.push(c);
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
i++;
|
|
242
|
+
switch (inner[i]) {
|
|
243
|
+
case QUOTE:
|
|
244
|
+
out.push(QUOTE);
|
|
245
|
+
break;
|
|
246
|
+
case BACKSLASH:
|
|
247
|
+
out.push(BACKSLASH);
|
|
248
|
+
break;
|
|
249
|
+
// ClickHouse escapes forward slashes by default
|
|
250
|
+
// (output_format_json_escape_forward_slashes = 1).
|
|
251
|
+
case SLASH:
|
|
252
|
+
out.push(SLASH);
|
|
253
|
+
break;
|
|
254
|
+
case LOWER_B:
|
|
255
|
+
out.push(BACKSPACE);
|
|
256
|
+
break;
|
|
257
|
+
case LOWER_F:
|
|
258
|
+
out.push(FORM_FEED);
|
|
259
|
+
break;
|
|
260
|
+
case LOWER_N:
|
|
261
|
+
out.push(LF);
|
|
262
|
+
break;
|
|
263
|
+
case LOWER_R:
|
|
264
|
+
out.push(CR);
|
|
265
|
+
break;
|
|
266
|
+
case LOWER_T:
|
|
267
|
+
out.push(TAB);
|
|
268
|
+
break;
|
|
269
|
+
case LOWER_U: {
|
|
270
|
+
const hi = this.hex4(inner, i + 1);
|
|
271
|
+
i += 4;
|
|
272
|
+
let cp = hi;
|
|
273
|
+
if (hi >= 0xd800 && hi <= 0xdbff && inner[i + 1] === BACKSLASH && inner[i + 2] === LOWER_U) {
|
|
274
|
+
const lo = this.hex4(inner, i + 3);
|
|
275
|
+
if (lo >= 0xdc00 && lo <= 0xdfff) {
|
|
276
|
+
cp = 0x10000 + ((hi - 0xd800) << 10) + (lo - 0xdc00);
|
|
277
|
+
i += 6;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// A lone surrogate has no UTF-8 encoding; the reference's `unquote`
|
|
281
|
+
// maps it to U+FFFD, and so does this.
|
|
282
|
+
if (cp >= 0xd800 && cp <= 0xdfff)
|
|
283
|
+
out.push(...REPLACEMENT);
|
|
284
|
+
else
|
|
285
|
+
for (const byte of Buffer.from(String.fromCodePoint(cp), 'utf8'))
|
|
286
|
+
out.push(byte);
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
default:
|
|
290
|
+
this.fail('unknown escape in a string');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return Buffer.from(out);
|
|
294
|
+
}
|
|
295
|
+
hex4(inner, at) {
|
|
296
|
+
let n = 0;
|
|
297
|
+
for (let k = 0; k < 4; k++) {
|
|
298
|
+
const c = inner[at + k];
|
|
299
|
+
if (c === undefined)
|
|
300
|
+
this.fail('truncated \\u escape');
|
|
301
|
+
const d = c >= 0x30 && c <= 0x39
|
|
302
|
+
? c - 0x30
|
|
303
|
+
: c >= 0x61 && c <= 0x66
|
|
304
|
+
? c - 0x61 + 10
|
|
305
|
+
: c >= 0x41 && c <= 0x46
|
|
306
|
+
? c - 0x41 + 10
|
|
307
|
+
: -1;
|
|
308
|
+
if (d < 0)
|
|
309
|
+
this.fail('bad \\u escape');
|
|
310
|
+
n = n * 16 + d;
|
|
311
|
+
}
|
|
312
|
+
return n;
|
|
313
|
+
}
|
|
314
|
+
array() {
|
|
315
|
+
const start = this.i;
|
|
316
|
+
this.i++;
|
|
317
|
+
const elements = [];
|
|
318
|
+
this.skipSpace();
|
|
319
|
+
if (this.b[this.i] === ARRAY_CLOSE) {
|
|
320
|
+
this.i++;
|
|
321
|
+
return new Json('array', this.b.subarray(start, this.i), EMPTY, elements);
|
|
322
|
+
}
|
|
323
|
+
for (;;) {
|
|
324
|
+
elements.push(this.value());
|
|
325
|
+
this.skipSpace();
|
|
326
|
+
const c = this.b[this.i];
|
|
327
|
+
if (c === COMMA) {
|
|
328
|
+
this.i++;
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
if (c === ARRAY_CLOSE) {
|
|
332
|
+
this.i++;
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
this.fail('expected , or ] in an array');
|
|
336
|
+
}
|
|
337
|
+
return new Json('array', this.b.subarray(start, this.i), EMPTY, elements);
|
|
338
|
+
}
|
|
339
|
+
object() {
|
|
340
|
+
const start = this.i;
|
|
341
|
+
this.i++;
|
|
342
|
+
const keys = [];
|
|
343
|
+
const values = [];
|
|
344
|
+
this.skipSpace();
|
|
345
|
+
if (this.b[this.i] === OBJECT_CLOSE) {
|
|
346
|
+
this.i++;
|
|
347
|
+
return new Json('object', this.b.subarray(start, this.i), EMPTY, values, keys);
|
|
348
|
+
}
|
|
349
|
+
for (;;) {
|
|
350
|
+
this.skipSpace();
|
|
351
|
+
if (this.b[this.i] !== QUOTE)
|
|
352
|
+
this.fail('expected a quoted key in an object');
|
|
353
|
+
// Duplicate keys are kept: ClickHouse can store a Map with a repeated key,
|
|
354
|
+
// and collapsing it here would report bytes the table does not hold.
|
|
355
|
+
keys.push(this.string().bytes);
|
|
356
|
+
this.skipSpace();
|
|
357
|
+
if (this.b[this.i] !== COLON)
|
|
358
|
+
this.fail('expected : after an object key');
|
|
359
|
+
this.i++;
|
|
360
|
+
values.push(this.value());
|
|
361
|
+
this.skipSpace();
|
|
362
|
+
const c = this.b[this.i];
|
|
363
|
+
if (c === COMMA) {
|
|
364
|
+
this.i++;
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
if (c === OBJECT_CLOSE) {
|
|
368
|
+
this.i++;
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
this.fail('expected , or } in an object');
|
|
372
|
+
}
|
|
373
|
+
return new Json('object', this.b.subarray(start, this.i), EMPTY, values, keys);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Parse a `chs_row` / `chs_rows` document: denormals repaired, every value
|
|
378
|
+
* carrying the exact bytes the library wrote.
|
|
379
|
+
*/
|
|
380
|
+
export function parseDocument(bytes) {
|
|
381
|
+
const p = new Parser(repairBareDenormals(bytes));
|
|
382
|
+
const v = p.value();
|
|
383
|
+
p.skipSpace();
|
|
384
|
+
if (!p.atEnd())
|
|
385
|
+
p.fail('unexpected data after the document');
|
|
386
|
+
return v;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Is this supplied text **one JSON value**? A spec rule rather than a language
|
|
390
|
+
* default (spec/bindings.md §detectors, measured 2026-08-17): the text is a JSON
|
|
391
|
+
* value only if a strict parse consumes **all** of it, with whitespace being
|
|
392
|
+
* exactly JSON's four (space, tab, LF, CR).
|
|
393
|
+
*
|
|
394
|
+
* Both edges cost real false transforms. A numeric *prefix* must not count —
|
|
395
|
+
* `1.2.3.4` is not `1.2` — and U+FEFF is **not** whitespace: JS's own
|
|
396
|
+
* `String.prototype.trim()` counts `<ZWNBSP>` as `WhiteSpace`, so a
|
|
397
|
+
* `trim()`-then-`JSON.parse` reading took a BOM-prefixed CSV field for the
|
|
398
|
+
* number after it and reported 12 `reformat` transforms that never happened.
|
|
399
|
+
* Deciding over bytes with this grammar makes both impossible.
|
|
400
|
+
*
|
|
401
|
+
* Returns `null` when the bytes are not a single JSON value (a TSV field, a bare
|
|
402
|
+
* CSV token, raw bytes).
|
|
403
|
+
*/
|
|
404
|
+
export function parseJsonValue(bytes) {
|
|
405
|
+
if (bytes.length === 0)
|
|
406
|
+
return null;
|
|
407
|
+
try {
|
|
408
|
+
const p = new Parser(bytes);
|
|
409
|
+
const v = p.value();
|
|
410
|
+
p.skipSpace();
|
|
411
|
+
return p.atEnd() ? v : null;
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
return null;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Quote the bare `inf` / `-inf` / `nan` tokens ClickHouse writes outside JSON
|
|
419
|
+
* strings. Port of `quoteBareDenormals`; the stored text is preserved exactly and
|
|
420
|
+
* only the quoting is added, so the slices this module hands out are the bytes
|
|
421
|
+
* ClickHouse would have written.
|
|
422
|
+
*/
|
|
423
|
+
export function repairBareDenormals(text) {
|
|
424
|
+
// Fast path: nothing that could be a bare denormal token.
|
|
425
|
+
if (!text.includes('inf') && !text.includes('nan'))
|
|
426
|
+
return text;
|
|
427
|
+
const startsWith = (word, at) => {
|
|
428
|
+
for (let k = 0; k < word.length; k++) {
|
|
429
|
+
if (text[at + k] !== word.charCodeAt(k))
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
return true;
|
|
433
|
+
};
|
|
434
|
+
const out = [];
|
|
435
|
+
let inString = false;
|
|
436
|
+
for (let i = 0; i < text.length; i++) {
|
|
437
|
+
const c = text[i];
|
|
438
|
+
if (inString) {
|
|
439
|
+
out.push(c);
|
|
440
|
+
if (c === BACKSLASH && i + 1 < text.length) {
|
|
441
|
+
i++;
|
|
442
|
+
out.push(text[i]);
|
|
443
|
+
}
|
|
444
|
+
else if (c === QUOTE) {
|
|
445
|
+
inString = false;
|
|
446
|
+
}
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
if (c === QUOTE) {
|
|
450
|
+
inString = true;
|
|
451
|
+
out.push(c);
|
|
452
|
+
continue;
|
|
453
|
+
}
|
|
454
|
+
// A value can only start right after one of these structural bytes.
|
|
455
|
+
if (out.length > 0) {
|
|
456
|
+
const prev = out[out.length - 1];
|
|
457
|
+
if (prev !== COLON && prev !== COMMA && prev !== ARRAY_OPEN && !isSpace(prev)) {
|
|
458
|
+
out.push(c);
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
let token = 0;
|
|
463
|
+
if (startsWith('-inf', i))
|
|
464
|
+
token = 4;
|
|
465
|
+
else if (startsWith('inf', i))
|
|
466
|
+
token = 3;
|
|
467
|
+
else if (startsWith('nan', i))
|
|
468
|
+
token = 3;
|
|
469
|
+
if (token > 0) {
|
|
470
|
+
const after = text[i + token];
|
|
471
|
+
if (after === undefined || after === COMMA || after === OBJECT_CLOSE || after === ARRAY_CLOSE) {
|
|
472
|
+
out.push(QUOTE);
|
|
473
|
+
for (let k = 0; k < token; k++)
|
|
474
|
+
out.push(text[i + k]);
|
|
475
|
+
out.push(QUOTE);
|
|
476
|
+
i += token - 1;
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
out.push(c);
|
|
481
|
+
}
|
|
482
|
+
return Buffer.from(out);
|
|
483
|
+
}
|
|
484
|
+
// ------------------------------------------------------------------ accessors
|
|
485
|
+
//
|
|
486
|
+
// Every field of a result document is optional: a rejected row's document omits
|
|
487
|
+
// `unknown_fields`, `unsupported_settings` and `computed` entirely and carries
|
|
488
|
+
// `"cols":[]` (spec/c-abi.md §Top-level fields). A binding must therefore treat
|
|
489
|
+
// each field as optional-with-a-default rather than requiring it.
|
|
490
|
+
/**
|
|
491
|
+
* One member of an object, by key. The **last** wins, which is what a JS object,
|
|
492
|
+
* a Go map and the arbiter's own `json.loads` all do — a document field is never
|
|
493
|
+
* repeated, and a stored value is read through `rawBytes`, never by key.
|
|
494
|
+
*/
|
|
495
|
+
export function field(value, key) {
|
|
496
|
+
if (value === undefined || value.kind !== 'object')
|
|
497
|
+
return undefined;
|
|
498
|
+
let found;
|
|
499
|
+
for (let i = 0; i < value.keys.length; i++) {
|
|
500
|
+
if (keyIs(value.keys[i], key))
|
|
501
|
+
found = value.items[i];
|
|
502
|
+
}
|
|
503
|
+
return found;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Compare a raw key against a field name without allocating: this runs a dozen
|
|
507
|
+
* times per column and the document's own field names are ASCII. A non-ASCII
|
|
508
|
+
* name falls back to a real decode rather than answering wrongly.
|
|
509
|
+
*/
|
|
510
|
+
function keyIs(key, want) {
|
|
511
|
+
for (let i = 0; i < want.length; i++) {
|
|
512
|
+
// One non-ASCII character and the byte length no longer matches the string
|
|
513
|
+
// length, so the fast path cannot answer at all.
|
|
514
|
+
if (want.charCodeAt(i) > 0x7f)
|
|
515
|
+
return key.toString('utf8') === want;
|
|
516
|
+
}
|
|
517
|
+
if (key.length !== want.length)
|
|
518
|
+
return false;
|
|
519
|
+
for (let i = 0; i < want.length; i++) {
|
|
520
|
+
if (key[i] !== want.charCodeAt(i))
|
|
521
|
+
return false;
|
|
522
|
+
}
|
|
523
|
+
return true;
|
|
524
|
+
}
|
|
525
|
+
/** Is this key present at all? `"stored": null` is a value; absence is not. */
|
|
526
|
+
export function hasField(value, key) {
|
|
527
|
+
return field(value, key) !== undefined;
|
|
528
|
+
}
|
|
529
|
+
/** The elements of an array (or an object's values); `[]` for anything else. */
|
|
530
|
+
export function items(value) {
|
|
531
|
+
return value === undefined ? NO_ITEMS : value.items;
|
|
532
|
+
}
|
|
533
|
+
/** A JSON string's text, decoded as UTF-8. `''` for any other kind. */
|
|
534
|
+
export function asString(value) {
|
|
535
|
+
return value !== undefined && value.kind === 'string' ? value.bytes.toString('utf8') : '';
|
|
536
|
+
}
|
|
537
|
+
/** A JSON string's **unescaped bytes** — authoritative where `asString` is not. */
|
|
538
|
+
export function asBytes(value) {
|
|
539
|
+
return value !== undefined && value.kind === 'string' ? value.bytes : EMPTY;
|
|
540
|
+
}
|
|
541
|
+
export function asStringArray(value) {
|
|
542
|
+
return items(value).map((v) => asString(v));
|
|
543
|
+
}
|
|
544
|
+
export function asInt(value) {
|
|
545
|
+
if (value !== undefined && value.kind === 'number') {
|
|
546
|
+
const n = Number(value.raw.toString('utf8'));
|
|
547
|
+
return Number.isFinite(n) ? n : 0;
|
|
548
|
+
}
|
|
549
|
+
return 0;
|
|
550
|
+
}
|
|
551
|
+
export function asBool(value) {
|
|
552
|
+
return value !== undefined && value.kind === 'bool' && value.raw[0] === LOWER_T;
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* The exact source bytes of a value — the equivalent of holding a
|
|
556
|
+
* `json.RawMessage`. Duplicate keys, escape spellings and 256-bit digits all
|
|
557
|
+
* survive, because nothing is re-rendered.
|
|
558
|
+
*
|
|
559
|
+
* Not the same thing as `asBytes`, and the difference decides correctness: for
|
|
560
|
+
* the string `"a\\u000Bb"` this returns all nine bytes **including the quotes and
|
|
561
|
+
* the escape**, which is what a stored value's rendering is, while `asBytes`
|
|
562
|
+
* returns the three bytes the escape stands for, which is what a *field of the
|
|
563
|
+
* document* (`input`, `name`, `err`) means.
|
|
564
|
+
*/
|
|
565
|
+
export function rawBytes(value) {
|
|
566
|
+
return value === undefined ? EMPTY : value.raw;
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* `rawBytes` decoded as UTF-8, for logs, comparisons and messages. **Lossy when
|
|
570
|
+
* the value is not valid UTF-8** — a ClickHouse `String` column holds arbitrary
|
|
571
|
+
* bytes, `isValidUtf8(rawBytes(v))` says whether this text is exact, and
|
|
572
|
+
* `rawBytes` is the authority.
|
|
573
|
+
*/
|
|
574
|
+
export function rawText(value) {
|
|
575
|
+
return rawBytes(value).toString('utf8');
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=json.js.map
|
package/dist/json.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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"}
|