zkjson 0.1.21 → 0.1.23
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/encoder.js +74 -75
- package/package.json +1 -1
- package/parse.js +133 -92
- package/uint.js +246 -203
package/encoder.js
CHANGED
@@ -99,39 +99,39 @@ function encodePath(path) {
|
|
99
99
|
let str = ""
|
100
100
|
let num = 0
|
101
101
|
for (const s of path) {
|
102
|
-
if (num
|
103
|
-
if (s
|
104
|
-
if (num
|
102
|
+
if (num == 2 && !(s == "." || s == "[")) throw Error()
|
103
|
+
if (s == ".") {
|
104
|
+
if (num == 2) {
|
105
105
|
num = 0
|
106
106
|
} else {
|
107
107
|
parts.push(str)
|
108
108
|
str = ""
|
109
109
|
}
|
110
|
-
} else if (s
|
111
|
-
if (num
|
112
|
-
if (str
|
110
|
+
} else if (s == "[") {
|
111
|
+
if (num != 2) {
|
112
|
+
if (str != "" || parts.length > 0) parts.push(str)
|
113
113
|
str = ""
|
114
114
|
}
|
115
115
|
num = 1
|
116
|
-
} else if (s
|
117
|
-
if (num
|
116
|
+
} else if (s == "]") {
|
117
|
+
if (num != 1) throw Error()
|
118
118
|
num = 2
|
119
|
-
if (str
|
119
|
+
if (str == "" || Number.isNaN(+str)) throw Error()
|
120
120
|
parts.push(+str)
|
121
121
|
str = ""
|
122
122
|
} else {
|
123
123
|
str += s
|
124
124
|
}
|
125
125
|
}
|
126
|
-
if (str
|
127
|
-
if (parts.length
|
126
|
+
if (str != "") parts.push(str)
|
127
|
+
if (parts.length == 0) parts.push("")
|
128
128
|
let encoded = [parts.length]
|
129
129
|
for (const p of parts) {
|
130
|
-
if (typeof p
|
130
|
+
if (typeof p == "number") {
|
131
131
|
encoded = encoded.concat([0, 0, p])
|
132
132
|
} else {
|
133
133
|
let plen = [p.length]
|
134
|
-
if (p.length
|
134
|
+
if (p.length == 0) plen.push(1)
|
135
135
|
encoded = encoded.concat([
|
136
136
|
...plen,
|
137
137
|
...p.split("").map(c => c.charCodeAt(0)),
|
@@ -148,9 +148,9 @@ function decodePath(path) {
|
|
148
148
|
while (path.length > 0) {
|
149
149
|
const type = path.shift()
|
150
150
|
let val = null
|
151
|
-
if (type
|
151
|
+
if (type == 0) {
|
152
152
|
const type2 = path.shift()
|
153
|
-
if (type2
|
153
|
+
if (type2 == 0) {
|
154
154
|
val = [type2, path.shift()]
|
155
155
|
} else {
|
156
156
|
val = [type2]
|
@@ -165,14 +165,14 @@ function decodePath(path) {
|
|
165
165
|
}
|
166
166
|
let i = 0
|
167
167
|
for (let s of p) {
|
168
|
-
if (s[0]
|
168
|
+
if (s[0] == 0 && s[1] == 0) {
|
169
169
|
str += `[${s[2]}]`
|
170
|
-
} else if (s[0]
|
171
|
-
if (str
|
170
|
+
} else if (s[0] == 0 && s[1] == 1) {
|
171
|
+
if (str != "") str += "."
|
172
172
|
} else {
|
173
|
-
str += `${i
|
173
|
+
str += `${i == 0 ? "" : "."}${s
|
174
174
|
.slice(1)
|
175
|
-
.map(c => String.fromCharCode(c))
|
175
|
+
.map(c => String.fromCharCode(Number(c)))
|
176
176
|
.join("")}`
|
177
177
|
}
|
178
178
|
i++
|
@@ -190,13 +190,13 @@ function flattenPath(path) {
|
|
190
190
|
|
191
191
|
function _encode(v, path = []) {
|
192
192
|
let vals = []
|
193
|
-
if (typeof v
|
193
|
+
if (typeof v == "number") {
|
194
194
|
vals.push([path, encodeVal(v)])
|
195
|
-
} else if (typeof v
|
195
|
+
} else if (typeof v == "boolean") {
|
196
196
|
vals.push([path, encodeVal(v)])
|
197
|
-
} else if (v
|
197
|
+
} else if (v == null) {
|
198
198
|
vals.push([path, encodeVal(v)])
|
199
|
-
} else if (typeof v
|
199
|
+
} else if (typeof v == "string") {
|
200
200
|
vals.push([path, encodeVal(v)])
|
201
201
|
} else if (Array.isArray(v)) {
|
202
202
|
let i = 0
|
@@ -204,12 +204,12 @@ function _encode(v, path = []) {
|
|
204
204
|
for (const v3 of _encode(v2, [...path, [0, 0, i]])) vals.push(v3)
|
205
205
|
i++
|
206
206
|
}
|
207
|
-
} else if (typeof v
|
207
|
+
} else if (typeof v == "object") {
|
208
208
|
for (const k in v) {
|
209
209
|
const key = k.split("").map(c => c.charCodeAt(0))
|
210
210
|
for (let v4 of _encode(v[k], [
|
211
211
|
...path,
|
212
|
-
[key.length, ...(key.length
|
212
|
+
[key.length, ...(key.length == 0 ? [1] : key)],
|
213
213
|
])) {
|
214
214
|
vals.push(v4)
|
215
215
|
}
|
@@ -220,9 +220,8 @@ function _encode(v, path = []) {
|
|
220
220
|
|
221
221
|
function encode(json) {
|
222
222
|
let flattened = _encode(json)
|
223
|
-
|
224
223
|
flattened.sort((a, b) => {
|
225
|
-
const isUndefined = v => typeof v
|
224
|
+
const isUndefined = v => typeof v == "undefined"
|
226
225
|
const max = Math.max(a[0].length, b[0].length)
|
227
226
|
if (max > 0) {
|
228
227
|
for (let i = 0; i < max; i++) {
|
@@ -250,7 +249,7 @@ function encode(json) {
|
|
250
249
|
|
251
250
|
return flattened.reduce(
|
252
251
|
(arr, v) => arr.concat([...flattenPath(v[0]), ...v[1]]),
|
253
|
-
[]
|
252
|
+
[],
|
254
253
|
)
|
255
254
|
}
|
256
255
|
|
@@ -262,14 +261,14 @@ function _decode(arr) {
|
|
262
261
|
let val = null
|
263
262
|
while (plen > 0) {
|
264
263
|
const plen2 = arr.shift()
|
265
|
-
if (plen2
|
264
|
+
if (plen2 == 0) {
|
266
265
|
const plen3 = arr.shift()
|
267
|
-
if (plen3
|
266
|
+
if (plen3 == 1) {
|
268
267
|
keys.push([plen2, plen3])
|
269
268
|
} else {
|
270
269
|
keys.push([plen2, plen3, arr.shift()])
|
271
270
|
}
|
272
|
-
} else if (plen2
|
271
|
+
} else if (plen2 != 0) {
|
273
272
|
const plen3 = plen2
|
274
273
|
const key = []
|
275
274
|
for (let i2 = 0; i2 < plen3; i2++) key.push(arr.shift())
|
@@ -279,13 +278,13 @@ function _decode(arr) {
|
|
279
278
|
}
|
280
279
|
const type = arr.shift()
|
281
280
|
val = [type]
|
282
|
-
if (type
|
281
|
+
if (type == 2) {
|
283
282
|
val.push(arr.shift())
|
284
283
|
val.push(arr.shift())
|
285
284
|
val.push(arr.shift())
|
286
|
-
} else if (type
|
285
|
+
} else if (type == 1) {
|
287
286
|
val.push(arr.shift())
|
288
|
-
} else if (type
|
287
|
+
} else if (type == 3) {
|
289
288
|
const strlen = arr.shift()
|
290
289
|
val.push(strlen)
|
291
290
|
for (let i2 = 0; i2 < strlen; i2++) val.push(arr.shift())
|
@@ -297,20 +296,20 @@ function _decode(arr) {
|
|
297
296
|
|
298
297
|
function encodeVal(v) {
|
299
298
|
let vals = []
|
300
|
-
if (typeof v
|
299
|
+
if (typeof v == "number" || typeof v == "bigint") {
|
301
300
|
const int = Number.isInteger(v)
|
302
301
|
let moved = 0
|
303
302
|
let num = v
|
304
|
-
while (num % 1
|
303
|
+
while (num % 1 != 0) {
|
305
304
|
num *= 10
|
306
305
|
moved += 1
|
307
306
|
}
|
308
307
|
vals = v < 0 ? [2, 0, moved, -num] : [2, 1, moved, num]
|
309
|
-
} else if (typeof v
|
308
|
+
} else if (typeof v == "boolean") {
|
310
309
|
vals = [1, v ? 1 : 0]
|
311
|
-
} else if (v
|
310
|
+
} else if (v == null) {
|
312
311
|
vals = [0]
|
313
|
-
} else if (typeof v
|
312
|
+
} else if (typeof v == "string") {
|
314
313
|
vals = [3, v.length, ...v.split("").map(c => c.charCodeAt(0))]
|
315
314
|
} else {
|
316
315
|
vals = [4, ...encode(v)]
|
@@ -322,21 +321,21 @@ function decodeVal(arr) {
|
|
322
321
|
const type = arr[0]
|
323
322
|
const _val = arr[1]
|
324
323
|
let val = null
|
325
|
-
if (type
|
324
|
+
if (type == 0) {
|
326
325
|
val = null
|
327
|
-
} else if (type
|
326
|
+
} else if (type == 1) {
|
328
327
|
val = arr[1] ? true : false
|
329
|
-
} else if (type
|
330
|
-
val = (arr[1]
|
328
|
+
} else if (type == 2) {
|
329
|
+
val = (arr[1] == 0 ? -1 : 1) * arr[3]
|
331
330
|
for (let i = 0; i < arr[2]; i++) {
|
332
331
|
val /= 10
|
333
332
|
}
|
334
|
-
} else if (type
|
333
|
+
} else if (type == 3) {
|
335
334
|
val = arr
|
336
335
|
.slice(2)
|
337
|
-
.map(c => String.fromCharCode(c))
|
336
|
+
.map(c => String.fromCharCode(Number(c)))
|
338
337
|
.join("")
|
339
|
-
} else if (type
|
338
|
+
} else if (type == 4) {
|
340
339
|
val = decode(arr.slice(1))
|
341
340
|
}
|
342
341
|
return val
|
@@ -345,31 +344,31 @@ function decodeVal(arr) {
|
|
345
344
|
function decode(arr) {
|
346
345
|
const decoded = _decode(arr)
|
347
346
|
let json =
|
348
|
-
decoded[0]?.[0]?.[0]?.[0]
|
347
|
+
decoded[0]?.[0]?.[0]?.[0] == 0 && decoded[0]?.[0]?.[0]?.[1] == 0 ? [] : {}
|
349
348
|
for (const v of decoded) {
|
350
349
|
const keys = v[0].map(v2 => {
|
351
|
-
if (v2[0]
|
352
|
-
if (v2[1]
|
350
|
+
if (v2[0] == 0) {
|
351
|
+
if (v2[1] == 1) return ""
|
353
352
|
return v2[2]
|
354
353
|
} else {
|
355
354
|
return v2
|
356
355
|
.slice(1)
|
357
|
-
.map(c => String.fromCharCode(c))
|
356
|
+
.map(c => String.fromCharCode(Number(c)))
|
358
357
|
.join("")
|
359
358
|
}
|
360
359
|
})
|
361
|
-
if (keys.length
|
360
|
+
if (keys.length == 0) {
|
362
361
|
json = decodeVal(v[1])
|
363
362
|
} else {
|
364
363
|
let obj = json
|
365
364
|
let i = 0
|
366
365
|
for (const k of keys) {
|
367
|
-
if (typeof k
|
368
|
-
if (typeof keys[i + 1]
|
366
|
+
if (typeof k == "number") {
|
367
|
+
if (typeof keys[i + 1] == "undefined") {
|
369
368
|
obj[k] = decodeVal(v[1])
|
370
369
|
} else {
|
371
|
-
if (typeof obj[k]
|
372
|
-
if (typeof keys[i + 1]
|
370
|
+
if (typeof obj[k] == "undefined") {
|
371
|
+
if (typeof keys[i + 1] == "string") {
|
373
372
|
obj[k] = {}
|
374
373
|
} else {
|
375
374
|
obj[k] = []
|
@@ -377,10 +376,10 @@ function decode(arr) {
|
|
377
376
|
}
|
378
377
|
}
|
379
378
|
} else {
|
380
|
-
if (typeof obj[k]
|
381
|
-
if (typeof keys[i + 1]
|
379
|
+
if (typeof obj[k] == "undefined") {
|
380
|
+
if (typeof keys[i + 1] == "undefined") {
|
382
381
|
obj[k] = decodeVal(v[1])
|
383
|
-
} else if (typeof keys[i + 1]
|
382
|
+
} else if (typeof keys[i + 1] == "string") {
|
384
383
|
obj[k] = {}
|
385
384
|
} else {
|
386
385
|
obj[k] = []
|
@@ -421,12 +420,12 @@ function toSignal(arr) {
|
|
421
420
|
let str = splitEvery(8, n.toString().split(""))
|
422
421
|
let i = 0
|
423
422
|
str = str.map(s => {
|
424
|
-
const len = i
|
423
|
+
const len = i == str.length - 1 ? s.length : 9
|
425
424
|
i++
|
426
425
|
return len.toString() + s.join("")
|
427
426
|
})
|
428
427
|
return str
|
429
|
-
})
|
428
|
+
}),
|
430
429
|
)
|
431
430
|
let _arr2 = []
|
432
431
|
let one = 0
|
@@ -434,10 +433,10 @@ function toSignal(arr) {
|
|
434
433
|
let start = null
|
435
434
|
for (let v of _arr) {
|
436
435
|
_arr2.push(v)
|
437
|
-
if (v.length - 1
|
438
|
-
if (start
|
436
|
+
if (v.length - 1 == 1) {
|
437
|
+
if (start == null) start = i
|
439
438
|
one += v.length - 1
|
440
|
-
if (one
|
439
|
+
if (one == 9) {
|
441
440
|
_arr2[start] = `0${one}${_arr2[start][1]}`
|
442
441
|
for (let i2 = start + 1; i2 <= i; i2++) _arr2[i2] = `${_arr2[i2][1]}`
|
443
442
|
one = 0
|
@@ -462,11 +461,11 @@ function toSignal(arr) {
|
|
462
461
|
let cur = 0
|
463
462
|
let num = ""
|
464
463
|
for (let v of _arr2) {
|
465
|
-
if (chain
|
464
|
+
if (chain == null && +v[0] == 0) {
|
466
465
|
chain = +v[1]
|
467
466
|
cur = 1
|
468
467
|
num = v
|
469
|
-
} else if (chain
|
468
|
+
} else if (chain != null) {
|
470
469
|
num += v
|
471
470
|
cur++
|
472
471
|
if (chain == cur) {
|
@@ -479,19 +478,19 @@ function toSignal(arr) {
|
|
479
478
|
_arr3.push(v)
|
480
479
|
}
|
481
480
|
}
|
482
|
-
if (chain
|
481
|
+
if (chain != null) _arr3.push(num)
|
483
482
|
let arrs2 = []
|
484
483
|
let len2 = 0
|
485
484
|
let str2 = ""
|
486
485
|
for (let v of _arr3) {
|
487
486
|
if (len2 + v.length > 75) {
|
488
487
|
arrs2.push("1" + str2)
|
489
|
-
if (+v[0]
|
488
|
+
if (+v[0] == 0) {
|
490
489
|
let len3 = 75 - len2
|
491
490
|
if (len3 == 2 || len3 == 3) {
|
492
491
|
arrs2[arrs2.length - 1] += `1${v[2]}`
|
493
492
|
let new_len = +v[1] - 1
|
494
|
-
if (new_len
|
493
|
+
if (new_len == 2) {
|
495
494
|
v = `1${v[3]}1${v[4]}`
|
496
495
|
} else {
|
497
496
|
v = `0${new_len}${v.slice(3)}`
|
@@ -499,16 +498,16 @@ function toSignal(arr) {
|
|
499
498
|
} else if (len3 > 3) {
|
500
499
|
let new_len = +v[1] - 2
|
501
500
|
let old_len = 2
|
502
|
-
if (len3
|
501
|
+
if (len3 == 4) {
|
503
502
|
arrs2[arrs2.length - 1] += `1${v[2]}1${v[3]}`
|
504
503
|
} else {
|
505
504
|
old_len = len3 - 2
|
506
505
|
new_len = +v[1] - old_len
|
507
506
|
arrs2[arrs2.length - 1] += `0${old_len}${v.slice(2, 2 + old_len)}`
|
508
507
|
}
|
509
|
-
if (new_len
|
508
|
+
if (new_len == 1) {
|
510
509
|
v = `1${v[old_len + 2]}`
|
511
|
-
} else if (new_len
|
510
|
+
} else if (new_len == 2) {
|
512
511
|
v = `1${v[old_len + 2]}1${v[old_len + 3]}`
|
513
512
|
} else {
|
514
513
|
v = `0${new_len}${v.slice(old_len + 2)}`
|
@@ -521,7 +520,7 @@ function toSignal(arr) {
|
|
521
520
|
len2 += v.length
|
522
521
|
str2 += v
|
523
522
|
}
|
524
|
-
if (str2
|
523
|
+
if (str2 != "") arrs2.push("1" + str2)
|
525
524
|
return arrs2
|
526
525
|
}
|
527
526
|
|
@@ -533,13 +532,13 @@ function fromSignal(arr) {
|
|
533
532
|
let str = s.split("")
|
534
533
|
while (str.length > 0) {
|
535
534
|
const len = +str.shift()
|
536
|
-
if (len
|
535
|
+
if (len == 0) {
|
537
536
|
const len2 = +str.shift()
|
538
537
|
for (let i2 = 0; i2 < len2; i2++) {
|
539
538
|
_arr.push(+str[i2])
|
540
539
|
}
|
541
540
|
str = str.slice(len2)
|
542
|
-
} else if (len
|
541
|
+
} else if (len == 9) {
|
543
542
|
prev += str.slice(0, 8).join("")
|
544
543
|
str = str.slice(8)
|
545
544
|
} else {
|