@based/schema 5.0.0-alpha.9 → 5.0.1
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/dist/def/addEdges.js +26 -3
- package/dist/def/createEmptyDef.d.ts +13 -9
- package/dist/def/createEmptyDef.js +7 -3
- package/dist/def/defaultMap.js +28 -24
- package/dist/def/fillEmptyMain.d.ts +2 -2
- package/dist/def/fillEmptyMain.js +13 -4
- package/dist/def/index.d.ts +0 -1
- package/dist/def/index.js +0 -1
- package/dist/def/makeSeparateSort.js +6 -6
- package/dist/def/makeSeparateTextSort.js +12 -12
- package/dist/def/refSet.d.ts +7 -0
- package/dist/def/refSet.js +25 -0
- package/dist/def/selvaBuffer.js +77 -28
- package/dist/def/typeDef.d.ts +9 -3
- package/dist/def/typeDef.js +136 -59
- package/dist/def/typeIndexes.d.ts +40 -0
- package/dist/def/typeIndexes.js +50 -0
- package/dist/def/types.d.ts +36 -57
- package/dist/def/types.js +22 -28
- package/dist/def/utils.d.ts +5 -3
- package/dist/def/utils.js +44 -2
- package/dist/def/validation.d.ts +2 -0
- package/dist/def/validation.js +89 -41
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/infer.d.ts +82 -0
- package/dist/infer.js +5 -0
- package/dist/lang.d.ts +3 -1
- package/dist/lang.js +6 -0
- package/dist/parse/assert.d.ts +4 -0
- package/dist/parse/assert.js +19 -2
- package/dist/parse/index.d.ts +2 -0
- package/dist/parse/index.js +61 -4
- package/dist/parse/props.d.ts +1 -0
- package/dist/parse/props.js +171 -54
- package/dist/parse/semver/_constants.d.ts +12 -0
- package/dist/parse/semver/_constants.js +21 -0
- package/dist/parse/semver/_shared.d.ts +44 -0
- package/dist/parse/semver/_shared.js +165 -0
- package/dist/parse/semver/_test_comparator_set.d.ts +3 -0
- package/dist/parse/semver/_test_comparator_set.js +60 -0
- package/dist/parse/semver/can_parse.d.ts +17 -0
- package/dist/parse/semver/can_parse.js +28 -0
- package/dist/parse/semver/compare.d.ts +28 -0
- package/dist/parse/semver/compare.js +36 -0
- package/dist/parse/semver/difference.d.ts +27 -0
- package/dist/parse/semver/difference.js +41 -0
- package/dist/parse/semver/equals.d.ts +24 -0
- package/dist/parse/semver/equals.js +28 -0
- package/dist/parse/semver/format.d.ts +22 -0
- package/dist/parse/semver/format.js +33 -0
- package/dist/parse/semver/format_range.d.ts +18 -0
- package/dist/parse/semver/format_range.js +29 -0
- package/dist/parse/semver/greater_or_equal.d.ts +25 -0
- package/dist/parse/semver/greater_or_equal.js +27 -0
- package/dist/parse/semver/greater_than.d.ts +25 -0
- package/dist/parse/semver/greater_than.js +29 -0
- package/dist/parse/semver/greater_than_range.d.ts +23 -0
- package/dist/parse/semver/greater_than_range.js +59 -0
- package/dist/parse/semver/increment.d.ts +51 -0
- package/dist/parse/semver/increment.js +175 -0
- package/dist/parse/semver/is_range.d.ts +23 -0
- package/dist/parse/semver/is_range.js +39 -0
- package/dist/parse/semver/is_semver.d.ts +34 -0
- package/dist/parse/semver/is_semver.js +54 -0
- package/dist/parse/semver/less_or_equal.d.ts +25 -0
- package/dist/parse/semver/less_or_equal.js +27 -0
- package/dist/parse/semver/less_than.d.ts +25 -0
- package/dist/parse/semver/less_than.js +27 -0
- package/dist/parse/semver/less_than_range.d.ts +23 -0
- package/dist/parse/semver/less_than_range.js +59 -0
- package/dist/parse/semver/max_satisfying.d.ts +22 -0
- package/dist/parse/semver/max_satisfying.js +31 -0
- package/dist/parse/semver/min_satisfying.d.ts +22 -0
- package/dist/parse/semver/min_satisfying.js +31 -0
- package/dist/parse/semver/mod.d.ts +298 -0
- package/dist/parse/semver/mod.js +301 -0
- package/dist/parse/semver/not_equals.d.ts +24 -0
- package/dist/parse/semver/not_equals.js +26 -0
- package/dist/parse/semver/parse.d.ts +25 -0
- package/dist/parse/semver/parse.js +43 -0
- package/dist/parse/semver/parse_range.d.ts +27 -0
- package/dist/parse/semver/parse_range.js +361 -0
- package/dist/parse/semver/range_intersects.d.ts +25 -0
- package/dist/parse/semver/range_intersects.js +83 -0
- package/dist/parse/semver/satisfies.d.ts +24 -0
- package/dist/parse/semver/satisfies.js +28 -0
- package/dist/parse/semver/try_parse.d.ts +21 -0
- package/dist/parse/semver/try_parse.js +28 -0
- package/dist/parse/semver/try_parse_range.d.ts +23 -0
- package/dist/parse/semver/try_parse_range.js +34 -0
- package/dist/parse/semver/types.d.ts +58 -0
- package/dist/parse/semver/types.js +4 -0
- package/dist/serialize.d.ts +14 -0
- package/dist/serialize.js +543 -0
- package/dist/types.d.ts +74 -20
- package/dist/types.js +3 -1
- package/package.json +5 -4
- package/dist/def/getPropLen.d.ts +0 -3
- package/dist/def/getPropLen.js +0 -23
- package/dist/def/makePacked.d.ts +0 -3
- package/dist/def/makePacked.js +0 -50
- package/dist/def/readFromPacked.d.ts +0 -3
- package/dist/def/readFromPacked.js +0 -140
- package/dist/mermaid.d.ts +0 -3
- package/dist/mermaid.js +0 -24
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright 2018-2025 the Deno authors. MIT license.
|
|
2
|
+
// This module is browser compatible.
|
|
3
|
+
import { parseRange } from './parse_range.js';
|
|
4
|
+
/**
|
|
5
|
+
* Parses the given range string and returns a Range object. If the range string
|
|
6
|
+
* is invalid, `undefined` is returned.
|
|
7
|
+
*
|
|
8
|
+
* @example Usage
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { tryParseRange } from "@std/semver";
|
|
11
|
+
* import { assertEquals } from "@std/assert";
|
|
12
|
+
*
|
|
13
|
+
* assertEquals(tryParseRange(">=1.2.3 <1.2.4"), [
|
|
14
|
+
* [
|
|
15
|
+
* { operator: ">=", major: 1, minor: 2, patch: 3, prerelease: [], build: [] },
|
|
16
|
+
* { operator: "<", major: 1, minor: 2, patch: 4, prerelease: [], build: [] },
|
|
17
|
+
* ],
|
|
18
|
+
* ]);
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @param value The range string
|
|
22
|
+
* @returns A Range object if valid otherwise `undefined`
|
|
23
|
+
*/
|
|
24
|
+
export function tryParseRange(value) {
|
|
25
|
+
try {
|
|
26
|
+
// Return '*' instead of '' so that truthiness works.
|
|
27
|
+
// This will throw if it's invalid anyway
|
|
28
|
+
return parseRange(value);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=try_parse_range.js.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The possible release types are used as an operator for the
|
|
3
|
+
* increment function and as a result of the difference function.
|
|
4
|
+
*/
|
|
5
|
+
export type ReleaseType = "pre" | "major" | "premajor" | "minor" | "preminor" | "patch" | "prepatch" | "prerelease";
|
|
6
|
+
/**
|
|
7
|
+
* SemVer comparison operators.
|
|
8
|
+
*/
|
|
9
|
+
export type Operator = undefined | "=" | "!=" | ">" | ">=" | "<" | "<=";
|
|
10
|
+
/**
|
|
11
|
+
* The shape of a valid SemVer comparator.
|
|
12
|
+
*
|
|
13
|
+
* @example Usage
|
|
14
|
+
* ```ts
|
|
15
|
+
* import type { Comparator } from "@std/semver/types";
|
|
16
|
+
*
|
|
17
|
+
* const comparator: Comparator = {
|
|
18
|
+
* operator: ">",
|
|
19
|
+
* major: 1,
|
|
20
|
+
* minor: 2,
|
|
21
|
+
* patch: 3,
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export interface Comparator extends SemVer {
|
|
26
|
+
/** The operator */
|
|
27
|
+
operator?: Operator;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A SemVer object parsed into its constituent parts.
|
|
31
|
+
*/
|
|
32
|
+
export interface SemVer {
|
|
33
|
+
/** The major version */
|
|
34
|
+
major: number;
|
|
35
|
+
/** The minor version */
|
|
36
|
+
minor: number;
|
|
37
|
+
/** The patch version */
|
|
38
|
+
patch: number;
|
|
39
|
+
/**
|
|
40
|
+
* The prerelease version
|
|
41
|
+
*
|
|
42
|
+
* @default {[]}
|
|
43
|
+
*/
|
|
44
|
+
prerelease?: (string | number)[];
|
|
45
|
+
/**
|
|
46
|
+
* The build metadata
|
|
47
|
+
*
|
|
48
|
+
* @default {[]}
|
|
49
|
+
*/
|
|
50
|
+
build?: string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A type representing a semantic version range. The ranges consist of
|
|
54
|
+
* a nested array, which represents a set of OR comparisons while the
|
|
55
|
+
* inner array represents AND comparisons.
|
|
56
|
+
*/
|
|
57
|
+
export type Range = Comparator[][];
|
|
58
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { StrictSchema } from './types.js';
|
|
2
|
+
type Opts = {
|
|
3
|
+
readOnly?: boolean;
|
|
4
|
+
stripMetaInformation?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare const serialize: (schema: any, opts?: Opts) => Uint8Array;
|
|
7
|
+
export declare const deSerializeKey: (buf: Uint8Array, keySize: number, i: number) => {
|
|
8
|
+
size: number;
|
|
9
|
+
value: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const deSerializeInner: (buf: Uint8Array, obj: any, start: number, fromArray: boolean) => number;
|
|
12
|
+
export declare const deSerialize: (buf: Uint8Array) => StrictSchema;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
// import * as deflate from 'fflate'
|
|
2
|
+
import { stringFormats } from './types.js';
|
|
3
|
+
import { ENUM, REVERSE_TYPE_INDEX_MAP, TYPE_INDEX_MAP } from './def/types.js';
|
|
4
|
+
import { readDoubleLE, readUint16, readUint24, readUint32, writeDoubleLE, writeUint16, writeUint24, writeUint32, ENCODER, DECODER, } from '@based/utils';
|
|
5
|
+
const UINT8 = 245;
|
|
6
|
+
const FALSE = 246;
|
|
7
|
+
const TRUE = 247;
|
|
8
|
+
const FUNCTION = 248;
|
|
9
|
+
const STRING = 249;
|
|
10
|
+
const ARRAY = 250;
|
|
11
|
+
const BINARY = 251;
|
|
12
|
+
const UINT32 = 252;
|
|
13
|
+
const FLOAT64 = 253;
|
|
14
|
+
const SCHEMA_PROP = 254;
|
|
15
|
+
const OBJECT = 255;
|
|
16
|
+
// Key Address encoding types
|
|
17
|
+
const KEY_ADDRESS_1_BYTE = 0;
|
|
18
|
+
const KEY_ADDRESS_2_BYTES = 1;
|
|
19
|
+
const KEY_ADDRESS_3_BYTES = 2;
|
|
20
|
+
// Key types
|
|
21
|
+
const PROPS = 3;
|
|
22
|
+
const TYPES = 4;
|
|
23
|
+
const READONLY = 5;
|
|
24
|
+
const FORMAT = 6;
|
|
25
|
+
const REQUIRED = 7;
|
|
26
|
+
const REF = 8;
|
|
27
|
+
const PROP = 9;
|
|
28
|
+
const KEY_OPTS = PROP;
|
|
29
|
+
const ensureCapacity = (required) => {
|
|
30
|
+
if (schemaBuffer.len + required > schemaBuffer.buf.length) {
|
|
31
|
+
const newBuf = new Uint8Array(Math.max(schemaBuffer.buf.length * 2, schemaBuffer.len + required));
|
|
32
|
+
newBuf.set(schemaBuffer.buf);
|
|
33
|
+
schemaBuffer.buf = newBuf;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
let schemaBuffer;
|
|
37
|
+
const handleSingleValue = (ops, val, obj, prev, fromObject, key) => {
|
|
38
|
+
const type = typeof val;
|
|
39
|
+
// typed Array - single PROP
|
|
40
|
+
if (val instanceof Uint8Array) {
|
|
41
|
+
ensureCapacity(1 + 2 + val.byteLength);
|
|
42
|
+
schemaBuffer.buf[schemaBuffer.len] = BINARY;
|
|
43
|
+
schemaBuffer.len += 1;
|
|
44
|
+
schemaBuffer.buf[schemaBuffer.len] = val.byteLength;
|
|
45
|
+
schemaBuffer.len += 1;
|
|
46
|
+
schemaBuffer.buf[schemaBuffer.len] = val.byteLength >>> 8;
|
|
47
|
+
schemaBuffer.len += 1;
|
|
48
|
+
schemaBuffer.buf.set(val, schemaBuffer.len);
|
|
49
|
+
schemaBuffer.len += val.byteLength;
|
|
50
|
+
}
|
|
51
|
+
else if (type === 'function') {
|
|
52
|
+
// Support both arrow functions and methods (including shorthand method syntax)
|
|
53
|
+
let str = val.toString();
|
|
54
|
+
if (/^[a-zA-Z0-9_$]+\s*\(/.test(str)) {
|
|
55
|
+
str = 'function ' + str;
|
|
56
|
+
}
|
|
57
|
+
ensureCapacity(1 + 2 + str.length * 4);
|
|
58
|
+
schemaBuffer.buf[schemaBuffer.len] = FUNCTION;
|
|
59
|
+
schemaBuffer.len += 1;
|
|
60
|
+
const sizeIndex = schemaBuffer.len;
|
|
61
|
+
schemaBuffer.len += 2;
|
|
62
|
+
// encodeInto is much faster as it avoids intermediate allocation.
|
|
63
|
+
const r = ENCODER.encodeInto(str, schemaBuffer.buf.subarray(schemaBuffer.len));
|
|
64
|
+
schemaBuffer.len += r.written;
|
|
65
|
+
schemaBuffer.buf[sizeIndex] = r.written;
|
|
66
|
+
schemaBuffer.buf[sizeIndex + 1] = r.written >>> 8;
|
|
67
|
+
}
|
|
68
|
+
else if (type === 'object') {
|
|
69
|
+
// fromObject
|
|
70
|
+
if (val === null) {
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
if (!fromObject && key === 'props' && obj.type === 'object') {
|
|
74
|
+
walk(ops, val, obj, prev, true, schemaBuffer);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
walk(ops, val, obj, prev, fromObject, schemaBuffer);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else if (type === 'boolean') {
|
|
82
|
+
ensureCapacity(1);
|
|
83
|
+
schemaBuffer.buf[schemaBuffer.len] = val ? TRUE : FALSE;
|
|
84
|
+
schemaBuffer.len += 1;
|
|
85
|
+
}
|
|
86
|
+
else if (type === 'string') {
|
|
87
|
+
// Pessimistically assume 4 bytes per char for UTF-8 to be safe.
|
|
88
|
+
ensureCapacity(1 + 2 + val.length * 4);
|
|
89
|
+
schemaBuffer.buf[schemaBuffer.len] = STRING;
|
|
90
|
+
schemaBuffer.len += 1;
|
|
91
|
+
const sizeIndex = schemaBuffer.len;
|
|
92
|
+
schemaBuffer.len += 2;
|
|
93
|
+
// encodeInto is much faster as it avoids intermediate allocation.
|
|
94
|
+
const r = ENCODER.encodeInto(val, schemaBuffer.buf.subarray(schemaBuffer.len));
|
|
95
|
+
schemaBuffer.len += r.written;
|
|
96
|
+
schemaBuffer.buf[sizeIndex] = r.written;
|
|
97
|
+
schemaBuffer.buf[sizeIndex + 1] = r.written >>> 8;
|
|
98
|
+
}
|
|
99
|
+
else if (type === 'number') {
|
|
100
|
+
const isInt = val % 1 === 0;
|
|
101
|
+
if (val < 256 && val > 0 && isInt) {
|
|
102
|
+
ensureCapacity(2);
|
|
103
|
+
schemaBuffer.buf[schemaBuffer.len] = UINT8;
|
|
104
|
+
schemaBuffer.len += 1;
|
|
105
|
+
schemaBuffer.buf[schemaBuffer.len] = val;
|
|
106
|
+
schemaBuffer.len += 1;
|
|
107
|
+
}
|
|
108
|
+
else if (val < 4294967295 && val > 0 && isInt) {
|
|
109
|
+
ensureCapacity(5);
|
|
110
|
+
schemaBuffer.buf[schemaBuffer.len] = UINT32;
|
|
111
|
+
schemaBuffer.len += 1;
|
|
112
|
+
writeUint32(schemaBuffer.buf, val, schemaBuffer.len);
|
|
113
|
+
schemaBuffer.len += 4;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
ensureCapacity(9);
|
|
117
|
+
schemaBuffer.buf[schemaBuffer.len] = FLOAT64;
|
|
118
|
+
schemaBuffer.len += 1;
|
|
119
|
+
writeDoubleLE(schemaBuffer.buf, val, schemaBuffer.len);
|
|
120
|
+
schemaBuffer.len += 8;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const encodeKey = (key, schemaBuffer) => {
|
|
125
|
+
let dictKey = schemaBuffer.dictMap[key];
|
|
126
|
+
// if len == 1 never from address
|
|
127
|
+
if (!dictKey) {
|
|
128
|
+
dictKey = {
|
|
129
|
+
changed: 0,
|
|
130
|
+
address: 0,
|
|
131
|
+
// used: [],
|
|
132
|
+
};
|
|
133
|
+
// pessimistically assume 4 bytes per char for UTF-8 to be safe.
|
|
134
|
+
ensureCapacity(1 + key.length * 4);
|
|
135
|
+
dictKey.address = schemaBuffer.len;
|
|
136
|
+
schemaBuffer.len += 1;
|
|
137
|
+
const r = ENCODER.encodeInto(key, schemaBuffer.buf.subarray(schemaBuffer.len));
|
|
138
|
+
schemaBuffer.buf[dictKey.address] = r.written + KEY_OPTS;
|
|
139
|
+
schemaBuffer.len += r.written;
|
|
140
|
+
// USED is the problem now
|
|
141
|
+
schemaBuffer.dictMapArr.push(dictKey);
|
|
142
|
+
schemaBuffer.dictMap[key] = dictKey;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
ensureCapacity(4);
|
|
146
|
+
// updated address? maybe
|
|
147
|
+
const dictMapUsed = { address: schemaBuffer.len, key: dictKey };
|
|
148
|
+
schemaBuffer.dictMapUsed.push(dictMapUsed);
|
|
149
|
+
// used can be handled differently - also pass to
|
|
150
|
+
// dictKey.used.push(dictMapUsed)
|
|
151
|
+
// console.log('USE KEY!', key)
|
|
152
|
+
// have to check this to correct - correctly
|
|
153
|
+
if (dictKey.address > 65025) {
|
|
154
|
+
schemaBuffer.buf[schemaBuffer.len] = KEY_ADDRESS_3_BYTES;
|
|
155
|
+
schemaBuffer.len += 1;
|
|
156
|
+
writeUint24(schemaBuffer.buf, dictKey.address, schemaBuffer.len);
|
|
157
|
+
schemaBuffer.len += 3;
|
|
158
|
+
}
|
|
159
|
+
else if (dictKey.address > 255) {
|
|
160
|
+
schemaBuffer.buf[schemaBuffer.len] = KEY_ADDRESS_2_BYTES;
|
|
161
|
+
schemaBuffer.len += 1;
|
|
162
|
+
writeUint16(schemaBuffer.buf, dictKey.address, schemaBuffer.len);
|
|
163
|
+
schemaBuffer.len += 2;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
schemaBuffer.buf[schemaBuffer.len] = KEY_ADDRESS_1_BYTE;
|
|
167
|
+
schemaBuffer.len += 1;
|
|
168
|
+
schemaBuffer.buf[schemaBuffer.len] = dictKey.address;
|
|
169
|
+
schemaBuffer.len += 1;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
// 3 level
|
|
174
|
+
// 0 for queries (min)
|
|
175
|
+
// 1 for modify
|
|
176
|
+
// 2 fulls schema
|
|
177
|
+
const walk = (opts, obj, prev, prev2, fromObject, schemaBuffer) => {
|
|
178
|
+
let start = schemaBuffer.len;
|
|
179
|
+
const isArray = Array.isArray(obj);
|
|
180
|
+
const isFromObj = prev2?.type === 'object' || fromObject === false;
|
|
181
|
+
const isSchemaProp = ('enum' in obj || ('type' in obj && TYPE_INDEX_MAP[obj.type])) && isFromObj;
|
|
182
|
+
ensureCapacity(1 + 5); // Type byte + size
|
|
183
|
+
if (isSchemaProp) {
|
|
184
|
+
schemaBuffer.buf[schemaBuffer.len++] = SCHEMA_PROP;
|
|
185
|
+
const typeIndex = TYPE_INDEX_MAP['enum' in obj ? 'enum' : obj.type];
|
|
186
|
+
schemaBuffer.buf[schemaBuffer.len++] = typeIndex;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
schemaBuffer.buf[schemaBuffer.len++] = isArray ? ARRAY : OBJECT;
|
|
190
|
+
}
|
|
191
|
+
let sizeIndex = schemaBuffer.len;
|
|
192
|
+
schemaBuffer.len += 4;
|
|
193
|
+
if (isArray) {
|
|
194
|
+
const len = obj.length;
|
|
195
|
+
ensureCapacity(2 * len + 2);
|
|
196
|
+
writeUint16(schemaBuffer.buf, len, schemaBuffer.len);
|
|
197
|
+
schemaBuffer.len += 2;
|
|
198
|
+
for (let j = 0; j < len; j++) {
|
|
199
|
+
if (len < 256) {
|
|
200
|
+
schemaBuffer.buf[schemaBuffer.len] = j;
|
|
201
|
+
schemaBuffer.len += 1;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
writeUint16(schemaBuffer.buf, j, schemaBuffer.len);
|
|
205
|
+
schemaBuffer.len += 2;
|
|
206
|
+
}
|
|
207
|
+
handleSingleValue(opts, obj[j], obj, prev, fromObject, j);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
for (const key in obj) {
|
|
212
|
+
if (opts.readOnly &&
|
|
213
|
+
isFromObj &&
|
|
214
|
+
(key === 'validation' || key === 'default')) {
|
|
215
|
+
if (key === 'validation' && typeof obj[key] === 'function') {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
else if (key === 'default') {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else if (isFromObj &&
|
|
223
|
+
(opts.stripMetaInformation || opts.readOnly) &&
|
|
224
|
+
(key === 'title' ||
|
|
225
|
+
key === 'description' ||
|
|
226
|
+
key === 'format' ||
|
|
227
|
+
key === 'display') &&
|
|
228
|
+
typeof obj[key] === 'string') {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
else if (key === 'type' && isSchemaProp) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
else if (key === 'required' && obj[key] === true) {
|
|
235
|
+
ensureCapacity(1);
|
|
236
|
+
schemaBuffer.buf[schemaBuffer.len] = REQUIRED;
|
|
237
|
+
schemaBuffer.len += 1;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
// Add this later
|
|
241
|
+
else if (key == 'ref' && isFromObj && typeof obj.ref === 'string') {
|
|
242
|
+
ensureCapacity(1);
|
|
243
|
+
schemaBuffer.buf[schemaBuffer.len] = REF;
|
|
244
|
+
schemaBuffer.len += 1;
|
|
245
|
+
encodeKey(obj[key], schemaBuffer);
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
else if (key === 'prop' && isFromObj && typeof obj.prop === 'string') {
|
|
249
|
+
ensureCapacity(1);
|
|
250
|
+
schemaBuffer.buf[schemaBuffer.len] = PROP;
|
|
251
|
+
schemaBuffer.len += 1;
|
|
252
|
+
encodeKey(obj[key], schemaBuffer);
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
else if (key === 'readOnly' && obj[key] === true) {
|
|
256
|
+
ensureCapacity(1);
|
|
257
|
+
schemaBuffer.buf[schemaBuffer.len] = READONLY;
|
|
258
|
+
schemaBuffer.len += 1;
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
else if (key === 'format' && isFromObj) {
|
|
262
|
+
ensureCapacity(2);
|
|
263
|
+
schemaBuffer.buf[schemaBuffer.len] = FORMAT;
|
|
264
|
+
schemaBuffer.len += 1;
|
|
265
|
+
schemaBuffer.buf[schemaBuffer.len] = stringFormats.indexOf(obj.format);
|
|
266
|
+
schemaBuffer.len += 1;
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
if (key === 'types') {
|
|
271
|
+
ensureCapacity(1);
|
|
272
|
+
schemaBuffer.buf[schemaBuffer.len] = TYPES;
|
|
273
|
+
schemaBuffer.len += 1;
|
|
274
|
+
}
|
|
275
|
+
else if (key === 'props') {
|
|
276
|
+
ensureCapacity(1);
|
|
277
|
+
schemaBuffer.buf[schemaBuffer.len] = PROPS;
|
|
278
|
+
schemaBuffer.len += 1;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
encodeKey(key, schemaBuffer);
|
|
282
|
+
}
|
|
283
|
+
// important to handle the size here...
|
|
284
|
+
handleSingleValue(opts, obj[key], obj, prev, fromObject, key);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
let size = schemaBuffer.len - start;
|
|
289
|
+
// 3 different sizes? 3, 2, 1 ?
|
|
290
|
+
if (size < 252) {
|
|
291
|
+
schemaBuffer.keyChangeIndex++;
|
|
292
|
+
schemaBuffer.buf[sizeIndex] = size; // + 3 - 3
|
|
293
|
+
for (let i = schemaBuffer.dictMapArr.length - 1; i > -1; i--) {
|
|
294
|
+
const keyDict = schemaBuffer.dictMapArr[i];
|
|
295
|
+
if (keyDict.address < start) {
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
keyDict.changed = schemaBuffer.keyChangeIndex;
|
|
300
|
+
keyDict.address -= 3;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
for (let i = schemaBuffer.dictMapUsed.length - 1; i > -1; i--) {
|
|
304
|
+
const keyDictUsed = schemaBuffer.dictMapUsed[i];
|
|
305
|
+
if (keyDictUsed.address < start) {
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
const keyDict = keyDictUsed.key;
|
|
310
|
+
if (keyDict.changed === schemaBuffer.keyChangeIndex) {
|
|
311
|
+
const addressSize = schemaBuffer.buf[keyDictUsed.address];
|
|
312
|
+
// aslo correct if its smaller... :|
|
|
313
|
+
if (addressSize === KEY_ADDRESS_3_BYTES) {
|
|
314
|
+
writeUint24(schemaBuffer.buf, keyDict.address, keyDictUsed.address + 1);
|
|
315
|
+
}
|
|
316
|
+
else if (addressSize === KEY_ADDRESS_2_BYTES) {
|
|
317
|
+
writeUint16(schemaBuffer.buf, keyDict.address, keyDictUsed.address + 1);
|
|
318
|
+
}
|
|
319
|
+
else if (addressSize === KEY_ADDRESS_1_BYTE) {
|
|
320
|
+
schemaBuffer.buf[keyDictUsed.address + 1] = keyDict.address;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
keyDictUsed.address -= 3;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
schemaBuffer.buf.copyWithin(sizeIndex + 1, sizeIndex + 4, sizeIndex + size);
|
|
327
|
+
schemaBuffer.len -= 3;
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
schemaBuffer.buf[sizeIndex] = 0; // means 4
|
|
331
|
+
writeUint24(schemaBuffer.buf, size, sizeIndex + 1);
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
export const serialize = (schema, opts = {}) => {
|
|
335
|
+
if (!schemaBuffer) {
|
|
336
|
+
schemaBuffer = {
|
|
337
|
+
buf: new Uint8Array(5e3), // 5kb default
|
|
338
|
+
len: 0,
|
|
339
|
+
dictMap: {},
|
|
340
|
+
dictMapArr: [],
|
|
341
|
+
dictMapUsed: [],
|
|
342
|
+
keyChangeIndex: 0,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
schemaBuffer.keyChangeIndex = 0;
|
|
346
|
+
schemaBuffer.len = 0;
|
|
347
|
+
schemaBuffer.dictMap = {};
|
|
348
|
+
schemaBuffer.dictMapArr = [];
|
|
349
|
+
schemaBuffer.dictMapUsed = [];
|
|
350
|
+
// defalte not supported in unpacking yet
|
|
351
|
+
const isDeflate = 0; // opts.deflate ? 1 : 0
|
|
352
|
+
walk(opts, schema, undefined, undefined, false, schemaBuffer);
|
|
353
|
+
const packed = new Uint8Array(schemaBuffer.buf.subarray(0, schemaBuffer.len));
|
|
354
|
+
// if (isDeflate) {
|
|
355
|
+
// // add extra byte! see if nessecary
|
|
356
|
+
// return deflate.deflateSync(packed)
|
|
357
|
+
// } else {
|
|
358
|
+
// console.log('USED', schemaBuffer.dictMapUsed.length)
|
|
359
|
+
return packed;
|
|
360
|
+
// }
|
|
361
|
+
};
|
|
362
|
+
// -------------
|
|
363
|
+
export const deSerializeKey = (buf, keySize, i) => {
|
|
364
|
+
let size = 0;
|
|
365
|
+
let value;
|
|
366
|
+
if (keySize === KEY_ADDRESS_3_BYTES) {
|
|
367
|
+
const dictAddress = readUint24(buf, i);
|
|
368
|
+
size += 3;
|
|
369
|
+
const actualKeySize = buf[dictAddress] - KEY_OPTS;
|
|
370
|
+
value = DECODER.decode(buf.subarray(dictAddress + 1, actualKeySize + dictAddress + 1));
|
|
371
|
+
}
|
|
372
|
+
else if (keySize === KEY_ADDRESS_2_BYTES) {
|
|
373
|
+
const dictAddress = readUint16(buf, i);
|
|
374
|
+
size += 2;
|
|
375
|
+
const actualKeySize = buf[dictAddress] - KEY_OPTS;
|
|
376
|
+
value = DECODER.decode(buf.subarray(dictAddress + 1, actualKeySize + dictAddress + 1));
|
|
377
|
+
}
|
|
378
|
+
else if (keySize === KEY_ADDRESS_1_BYTE) {
|
|
379
|
+
const dictAddress = buf[i];
|
|
380
|
+
size += 1;
|
|
381
|
+
const actualKeySize = buf[dictAddress] - KEY_OPTS;
|
|
382
|
+
value = DECODER.decode(buf.subarray(dictAddress + 1, actualKeySize + dictAddress + 1));
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
const actualKeySize = keySize - KEY_OPTS;
|
|
386
|
+
value = DECODER.decode(buf.subarray(i, actualKeySize + i));
|
|
387
|
+
size += actualKeySize;
|
|
388
|
+
}
|
|
389
|
+
return { size, value };
|
|
390
|
+
};
|
|
391
|
+
export const deSerializeInner = (buf, obj, start, fromArray) => {
|
|
392
|
+
let i = start;
|
|
393
|
+
const isSchemaProp = buf[i] === SCHEMA_PROP;
|
|
394
|
+
i += 1;
|
|
395
|
+
if (isSchemaProp) {
|
|
396
|
+
const type = buf[i];
|
|
397
|
+
const parsedType = REVERSE_TYPE_INDEX_MAP[type];
|
|
398
|
+
if (type !== ENUM) {
|
|
399
|
+
obj.type = parsedType;
|
|
400
|
+
}
|
|
401
|
+
i += 1;
|
|
402
|
+
}
|
|
403
|
+
let size;
|
|
404
|
+
if (buf[i] === 0) {
|
|
405
|
+
size = readUint24(buf, i + 1);
|
|
406
|
+
i += 4;
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
size = buf[i] - 3;
|
|
410
|
+
i += 1;
|
|
411
|
+
}
|
|
412
|
+
const end = size + start;
|
|
413
|
+
if (fromArray) {
|
|
414
|
+
i += 2;
|
|
415
|
+
}
|
|
416
|
+
while (i < end) {
|
|
417
|
+
let key;
|
|
418
|
+
if (fromArray) {
|
|
419
|
+
if (obj.length < 256) {
|
|
420
|
+
key = buf[i];
|
|
421
|
+
i += 1;
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
key = readUint16(buf, i);
|
|
425
|
+
i += 2;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
let keySize = buf[i];
|
|
430
|
+
i += 1;
|
|
431
|
+
// format!
|
|
432
|
+
if (keySize === REQUIRED) {
|
|
433
|
+
obj.required = true;
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
else if (keySize === FORMAT) {
|
|
437
|
+
obj.format = stringFormats[buf[i]];
|
|
438
|
+
i += 1;
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
else if (keySize === READONLY) {
|
|
442
|
+
obj.readOnly = true;
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
else if (keySize === TYPES) {
|
|
446
|
+
key = 'types';
|
|
447
|
+
}
|
|
448
|
+
else if (keySize === PROPS) {
|
|
449
|
+
key = 'props';
|
|
450
|
+
}
|
|
451
|
+
else if (keySize === REF) {
|
|
452
|
+
const valueKeySize = buf[i];
|
|
453
|
+
i += 1;
|
|
454
|
+
const { size, value } = deSerializeKey(buf, valueKeySize, i);
|
|
455
|
+
i += size;
|
|
456
|
+
obj.ref = value;
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
else if (keySize === PROP) {
|
|
460
|
+
const valueKeySize = buf[i];
|
|
461
|
+
i += 1;
|
|
462
|
+
const { size, value } = deSerializeKey(buf, valueKeySize, i);
|
|
463
|
+
i += size;
|
|
464
|
+
obj.prop = value;
|
|
465
|
+
continue;
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
const { size, value } = deSerializeKey(buf, keySize, i);
|
|
469
|
+
i += size;
|
|
470
|
+
key = value;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
if (buf[i] === UINT8) {
|
|
474
|
+
i += 1;
|
|
475
|
+
obj[key] = buf[i];
|
|
476
|
+
i += 1;
|
|
477
|
+
}
|
|
478
|
+
else if (buf[i] === FALSE) {
|
|
479
|
+
i += 1;
|
|
480
|
+
obj[key] = false;
|
|
481
|
+
}
|
|
482
|
+
else if (buf[i] === TRUE) {
|
|
483
|
+
i += 1;
|
|
484
|
+
obj[key] = true;
|
|
485
|
+
}
|
|
486
|
+
else if (buf[i] === FUNCTION) {
|
|
487
|
+
i += 1;
|
|
488
|
+
const size = readUint16(buf, i);
|
|
489
|
+
i += 2;
|
|
490
|
+
const fn = `return (${DECODER.decode(buf.subarray(i, i + size))})(payload, prop)`;
|
|
491
|
+
obj[key] = new Function('payload', 'prop', fn);
|
|
492
|
+
i += size;
|
|
493
|
+
}
|
|
494
|
+
else if (buf[i] === STRING) {
|
|
495
|
+
i += 1;
|
|
496
|
+
const size = readUint16(buf, i);
|
|
497
|
+
i += 2;
|
|
498
|
+
obj[key] = DECODER.decode(buf.subarray(i, i + size));
|
|
499
|
+
i += size;
|
|
500
|
+
}
|
|
501
|
+
else if (buf[i] === BINARY) {
|
|
502
|
+
i += 1;
|
|
503
|
+
const size = readUint16(buf, i);
|
|
504
|
+
i += 2;
|
|
505
|
+
obj[key] = buf.subarray(i, size + i);
|
|
506
|
+
i += size;
|
|
507
|
+
}
|
|
508
|
+
else if (buf[i] === UINT32) {
|
|
509
|
+
obj[key] = readUint32(buf, i + 1);
|
|
510
|
+
i += 5;
|
|
511
|
+
}
|
|
512
|
+
else if (buf[i] === FLOAT64) {
|
|
513
|
+
obj[key] = readDoubleLE(buf, i + 1);
|
|
514
|
+
i += 9;
|
|
515
|
+
}
|
|
516
|
+
else if (buf[i] === OBJECT || buf[i] === SCHEMA_PROP) {
|
|
517
|
+
const nest = (obj[key] = {});
|
|
518
|
+
const fieldSize = deSerializeInner(buf, nest, i, false);
|
|
519
|
+
i += fieldSize;
|
|
520
|
+
}
|
|
521
|
+
else if (buf[i] === ARRAY) {
|
|
522
|
+
const len = readUint16(buf, i + 3);
|
|
523
|
+
const nest = (obj[key] = new Array(len));
|
|
524
|
+
const fieldSize = deSerializeInner(buf, nest, i, true);
|
|
525
|
+
i += fieldSize;
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
console.warn('Invalid value type', buf[i], 'skip');
|
|
529
|
+
// Invalid value type
|
|
530
|
+
i += 1;
|
|
531
|
+
const size = buf[i] | ((buf[i + 1] << 8) >>> 0);
|
|
532
|
+
i += size;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
return i - start;
|
|
536
|
+
};
|
|
537
|
+
export const deSerialize = (buf) => {
|
|
538
|
+
// if first byte is deflate
|
|
539
|
+
const schema = {};
|
|
540
|
+
deSerializeInner(buf, schema, 0, false);
|
|
541
|
+
return schema;
|
|
542
|
+
};
|
|
543
|
+
//# sourceMappingURL=serialize.js.map
|