flatpack-json 8.14.3
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/LICENSE +21 -0
- package/README.md +17 -0
- package/dist/Flatpack.d.mts +92 -0
- package/dist/Flatpack.mjs +560 -0
- package/dist/RefElements.d.mts +139 -0
- package/dist/RefElements.mjs +385 -0
- package/dist/Trie.d.mts +18 -0
- package/dist/Trie.mjs +35 -0
- package/dist/flatpackUtil.d.mts +12 -0
- package/dist/flatpackUtil.mjs +95 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +5 -0
- package/dist/storage.d.mts +60 -0
- package/dist/storage.mjs +364 -0
- package/dist/stringify.d.mts +3 -0
- package/dist/stringify.mjs +13 -0
- package/dist/types.d.mts +99 -0
- package/dist/types.mjs +15 -0
- package/dist/unpack.d.mts +4 -0
- package/dist/unpack.mjs +163 -0
- package/package.json +59 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { ArrayElement, BigIntElement, DateElement, Index, MapElement, ObjectElement, ObjectWrapperElement, RegExpElement, SetElement, SimplePrimitive, StringElement, SubStringElement } from './types.mjs';
|
|
2
|
+
export interface BaseRef {
|
|
3
|
+
/** Unique id of the reference */
|
|
4
|
+
id: number;
|
|
5
|
+
}
|
|
6
|
+
export type FnIndexLookup = (ref: RefElements | undefined) => Index;
|
|
7
|
+
export interface RefElement<T> extends BaseRef {
|
|
8
|
+
toElement(lookupFn: FnIndexLookup): T;
|
|
9
|
+
clone(): RefElement<T>;
|
|
10
|
+
getDependencies(): RefElements[] | undefined;
|
|
11
|
+
}
|
|
12
|
+
export type RefElements = ArrayRefElement | BigIntRefElement | DateRefElement | MapRefElement | ObjectRefElement | ObjectWrapperRefElement | PrimitiveRefElement<boolean> | PrimitiveRefElement<null> | PrimitiveRefElement<number> | PrimitiveRefElement<SimplePrimitive> | PrimitiveRefElement<string> | PrimitiveRefElement<undefined> | RegExpRefElement | SetRefElement | StringPrimitiveRefElement | StringConcatRefElement | SubStringRefElement;
|
|
13
|
+
export type StringRefElements = SubStringRefElement | StringConcatRefElement | StringPrimitiveRefElement;
|
|
14
|
+
export declare class BaseRefElement implements BaseRef {
|
|
15
|
+
id: number;
|
|
16
|
+
setId(i: number): void;
|
|
17
|
+
}
|
|
18
|
+
export declare class PrimitiveRefElementBase<T extends SimplePrimitive> extends BaseRefElement implements RefElement<T> {
|
|
19
|
+
#private;
|
|
20
|
+
constructor(value: T);
|
|
21
|
+
toElement(): T;
|
|
22
|
+
get value(): T;
|
|
23
|
+
clone(): PrimitiveRefElement<T>;
|
|
24
|
+
getDependencies(): undefined;
|
|
25
|
+
}
|
|
26
|
+
export declare class PrimitiveRefElement<T extends SimplePrimitive> extends PrimitiveRefElementBase<T> {
|
|
27
|
+
constructor(value: T);
|
|
28
|
+
static fromJSON<T extends SimplePrimitive>(value: T): PrimitiveRefElement<T>;
|
|
29
|
+
}
|
|
30
|
+
export declare class NumberRefElement extends PrimitiveRefElementBase<number> {
|
|
31
|
+
constructor(value: number);
|
|
32
|
+
static fromJSON(value: number): NumberRefElement;
|
|
33
|
+
}
|
|
34
|
+
export declare class StringPrimitiveRefElement extends PrimitiveRefElementBase<string> {
|
|
35
|
+
constructor(value: string);
|
|
36
|
+
get length(): number;
|
|
37
|
+
static fromJSON(value: string): StringPrimitiveRefElement;
|
|
38
|
+
}
|
|
39
|
+
export declare class ObjectRefElement extends BaseRefElement implements RefElement<ObjectElement> {
|
|
40
|
+
#private;
|
|
41
|
+
constructor(keys?: ArrayRefElement, values?: ArrayRefElement);
|
|
42
|
+
keys(): ArrayRefElement | undefined;
|
|
43
|
+
values(): ArrayRefElement | undefined;
|
|
44
|
+
setKeysAndValues(keys: ArrayRefElement | undefined, values: ArrayRefElement): void;
|
|
45
|
+
toElement(lookup: FnIndexLookup): ObjectElement;
|
|
46
|
+
clone(): ObjectRefElement;
|
|
47
|
+
getDependencies(): RefElements[] | undefined;
|
|
48
|
+
static fromJSON(elem: ObjectElement, resolve: (index: number) => RefElements): ObjectRefElement;
|
|
49
|
+
}
|
|
50
|
+
export declare class ObjectWrapperRefElement extends BaseRefElement implements RefElement<ObjectElement> {
|
|
51
|
+
#private;
|
|
52
|
+
constructor(value?: RefElements);
|
|
53
|
+
setValue(value: RefElements): void;
|
|
54
|
+
toElement(lookup: FnIndexLookup): ObjectWrapperElement;
|
|
55
|
+
clone(): ObjectWrapperRefElement;
|
|
56
|
+
getDependencies(): RefElements[] | undefined;
|
|
57
|
+
static fromJSON(elem: ObjectWrapperElement, resolve: (index: number) => RefElements): ObjectWrapperRefElement;
|
|
58
|
+
}
|
|
59
|
+
export declare class SetRefElement extends BaseRefElement implements RefElement<SetElement> {
|
|
60
|
+
#private;
|
|
61
|
+
constructor(values?: ArrayRefElement);
|
|
62
|
+
setValues(values: ArrayRefElement): void;
|
|
63
|
+
toElement(lookup: FnIndexLookup): SetElement;
|
|
64
|
+
clone(): SetRefElement;
|
|
65
|
+
getDependencies(): RefElements[] | undefined;
|
|
66
|
+
values(): ArrayRefElement | undefined;
|
|
67
|
+
static fromJSON(elem: SetElement, resolve: (index: number) => RefElements): SetRefElement;
|
|
68
|
+
}
|
|
69
|
+
export declare class MapRefElement extends BaseRefElement implements RefElement<MapElement> {
|
|
70
|
+
#private;
|
|
71
|
+
constructor(keys?: ArrayRefElement, values?: ArrayRefElement);
|
|
72
|
+
setKeysAndValues(keys: ArrayRefElement, values: ArrayRefElement): void;
|
|
73
|
+
toElement(lookup: FnIndexLookup): MapElement;
|
|
74
|
+
clone(): MapRefElement;
|
|
75
|
+
getDependencies(): RefElements[] | undefined;
|
|
76
|
+
keys(): ArrayRefElement | undefined;
|
|
77
|
+
values(): ArrayRefElement | undefined;
|
|
78
|
+
static fromJSON(elem: MapElement, resolve: (index: number) => RefElements): MapRefElement;
|
|
79
|
+
}
|
|
80
|
+
export declare class RegExpRefElement extends BaseRefElement implements RefElement<RegExpElement> {
|
|
81
|
+
#private;
|
|
82
|
+
constructor(pattern: StringRefElements, flags: StringRefElements);
|
|
83
|
+
toElement(lookup: FnIndexLookup): RegExpElement;
|
|
84
|
+
clone(): RegExpRefElement;
|
|
85
|
+
getDependencies(): RefElements[] | undefined;
|
|
86
|
+
static fromJSON(elem: RegExpElement, resolve: (index: number) => RefElements): RegExpRefElement;
|
|
87
|
+
}
|
|
88
|
+
export declare class DateRefElement extends BaseRefElement implements RefElement<DateElement> {
|
|
89
|
+
#private;
|
|
90
|
+
constructor(value: number);
|
|
91
|
+
toElement(): DateElement;
|
|
92
|
+
clone(): DateRefElement;
|
|
93
|
+
getDependencies(): undefined;
|
|
94
|
+
static fromJSON(value: DateElement): DateRefElement;
|
|
95
|
+
}
|
|
96
|
+
export declare class BigIntRefElement extends BaseRefElement implements RefElement<BigIntElement> {
|
|
97
|
+
#private;
|
|
98
|
+
constructor(value: PrimitiveRefElement<number> | StringRefElements);
|
|
99
|
+
toElement(lookup: FnIndexLookup): BigIntElement;
|
|
100
|
+
clone(): BigIntRefElement;
|
|
101
|
+
getDependencies(): RefElements[] | undefined;
|
|
102
|
+
static fromJSON(elem: BigIntElement, resolve: (index: number) => RefElements): BigIntRefElement;
|
|
103
|
+
}
|
|
104
|
+
export declare class ArrayRefElement extends BaseRefElement implements RefElement<ArrayElement> {
|
|
105
|
+
#private;
|
|
106
|
+
constructor(values?: RefElements[]);
|
|
107
|
+
get hash(): number;
|
|
108
|
+
setValues(values: RefElements[]): void;
|
|
109
|
+
valueRefs(): RefElements[];
|
|
110
|
+
toElement(lookup: FnIndexLookup): ArrayElement;
|
|
111
|
+
get length(): number;
|
|
112
|
+
isEqual(other: ArrayRefElement): boolean;
|
|
113
|
+
clone(): ArrayRefElement;
|
|
114
|
+
getDependencies(): RefElements[] | undefined;
|
|
115
|
+
static fromJSON(elem: ArrayElement, resolve: (index: number) => RefElements): ArrayRefElement;
|
|
116
|
+
}
|
|
117
|
+
export declare class SubStringRefElement extends BaseRefElement implements RefElement<SubStringElement | string> {
|
|
118
|
+
#private;
|
|
119
|
+
constructor(value: StringRefElements, len: number, offset?: number);
|
|
120
|
+
toElement(lookup: FnIndexLookup): SubStringElement | string;
|
|
121
|
+
get value(): string;
|
|
122
|
+
get length(): number;
|
|
123
|
+
clone(): SubStringRefElement;
|
|
124
|
+
getDependencies(): RefElements[] | undefined;
|
|
125
|
+
static fromJSON(elem: SubStringElement, resolve: (index: number) => RefElements): SubStringRefElement;
|
|
126
|
+
}
|
|
127
|
+
export declare class StringConcatRefElement extends BaseRefElement implements RefElement<StringElement | string> {
|
|
128
|
+
#private;
|
|
129
|
+
constructor(values: StringRefElements[]);
|
|
130
|
+
toElement(lookup: FnIndexLookup): StringElement | string;
|
|
131
|
+
get value(): string;
|
|
132
|
+
get length(): number;
|
|
133
|
+
clone(): StringConcatRefElement;
|
|
134
|
+
getDependencies(): RefElements[] | undefined;
|
|
135
|
+
static fromJSON(elem: StringElement, resolve: (index: number) => RefElements): StringConcatRefElement;
|
|
136
|
+
}
|
|
137
|
+
export declare function isStringRefElements(elem: RefElements): elem is StringRefElements;
|
|
138
|
+
export declare function isPrimitiveRefElement(elem: RefElements): elem is PrimitiveRefElement<SimplePrimitive>;
|
|
139
|
+
//# sourceMappingURL=RefElements.d.mts.map
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { ElementType } from './types.mjs';
|
|
3
|
+
export class BaseRefElement {
|
|
4
|
+
id = 0;
|
|
5
|
+
setId(i) {
|
|
6
|
+
this.id = i;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class PrimitiveRefElementBase extends BaseRefElement {
|
|
10
|
+
#v;
|
|
11
|
+
constructor(value) {
|
|
12
|
+
super();
|
|
13
|
+
this.#v = value;
|
|
14
|
+
}
|
|
15
|
+
toElement() {
|
|
16
|
+
return this.#v;
|
|
17
|
+
}
|
|
18
|
+
get value() {
|
|
19
|
+
return this.#v;
|
|
20
|
+
}
|
|
21
|
+
clone() {
|
|
22
|
+
return new PrimitiveRefElement(this.#v);
|
|
23
|
+
}
|
|
24
|
+
getDependencies() {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class PrimitiveRefElement extends PrimitiveRefElementBase {
|
|
29
|
+
constructor(value) {
|
|
30
|
+
super(value);
|
|
31
|
+
}
|
|
32
|
+
static fromJSON(value) {
|
|
33
|
+
return new PrimitiveRefElement(value);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class NumberRefElement extends PrimitiveRefElementBase {
|
|
37
|
+
constructor(value) {
|
|
38
|
+
super(value);
|
|
39
|
+
}
|
|
40
|
+
static fromJSON(value) {
|
|
41
|
+
return new NumberRefElement(value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class StringPrimitiveRefElement extends PrimitiveRefElementBase {
|
|
45
|
+
constructor(value) {
|
|
46
|
+
super(value);
|
|
47
|
+
}
|
|
48
|
+
get length() {
|
|
49
|
+
return this.value.length;
|
|
50
|
+
}
|
|
51
|
+
static fromJSON(value) {
|
|
52
|
+
return new StringPrimitiveRefElement(value);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class ObjectRefElement extends BaseRefElement {
|
|
56
|
+
#k;
|
|
57
|
+
#v;
|
|
58
|
+
constructor(keys, values) {
|
|
59
|
+
super();
|
|
60
|
+
this.#k = keys;
|
|
61
|
+
this.#v = values;
|
|
62
|
+
}
|
|
63
|
+
keys() {
|
|
64
|
+
return this.#k;
|
|
65
|
+
}
|
|
66
|
+
values() {
|
|
67
|
+
return this.#v;
|
|
68
|
+
}
|
|
69
|
+
setKeysAndValues(keys, values) {
|
|
70
|
+
assert(!keys || keys.length === values.length);
|
|
71
|
+
this.#k = keys;
|
|
72
|
+
this.#v = values;
|
|
73
|
+
}
|
|
74
|
+
toElement(lookup) {
|
|
75
|
+
return [ElementType.Object, lookup(this.#k), lookup(this.#v)];
|
|
76
|
+
}
|
|
77
|
+
clone() {
|
|
78
|
+
return new ObjectRefElement(this.#k, this.#v);
|
|
79
|
+
}
|
|
80
|
+
getDependencies() {
|
|
81
|
+
return [this.#k, this.#v].filter((r) => !!r);
|
|
82
|
+
}
|
|
83
|
+
static fromJSON(elem, resolve) {
|
|
84
|
+
const keys = resolve(elem[1]);
|
|
85
|
+
const values = resolve(elem[2]);
|
|
86
|
+
if (isPrimitiveRefElement(values)) {
|
|
87
|
+
assert(values.value === undefined);
|
|
88
|
+
return new ObjectRefElement();
|
|
89
|
+
}
|
|
90
|
+
assert(keys instanceof ArrayRefElement || keys === undefined);
|
|
91
|
+
assert(values instanceof ArrayRefElement || values === undefined);
|
|
92
|
+
return new ObjectRefElement(keys, values);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export class ObjectWrapperRefElement extends BaseRefElement {
|
|
96
|
+
#v;
|
|
97
|
+
constructor(value) {
|
|
98
|
+
super();
|
|
99
|
+
this.#v = value;
|
|
100
|
+
}
|
|
101
|
+
setValue(value) {
|
|
102
|
+
this.#v = value;
|
|
103
|
+
}
|
|
104
|
+
toElement(lookup) {
|
|
105
|
+
return [ElementType.Object, 0, lookup(this.#v)];
|
|
106
|
+
}
|
|
107
|
+
clone() {
|
|
108
|
+
return new ObjectWrapperRefElement(this.#v);
|
|
109
|
+
}
|
|
110
|
+
getDependencies() {
|
|
111
|
+
return this.#v ? [this.#v] : undefined;
|
|
112
|
+
}
|
|
113
|
+
static fromJSON(elem, resolve) {
|
|
114
|
+
const values = resolve(elem[2]);
|
|
115
|
+
assert(elem[1] === 0);
|
|
116
|
+
return new ObjectWrapperRefElement(values);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export class SetRefElement extends BaseRefElement {
|
|
120
|
+
#v;
|
|
121
|
+
constructor(values) {
|
|
122
|
+
super();
|
|
123
|
+
this.#v = values;
|
|
124
|
+
}
|
|
125
|
+
setValues(values) {
|
|
126
|
+
this.#v = values;
|
|
127
|
+
}
|
|
128
|
+
toElement(lookup) {
|
|
129
|
+
return [ElementType.Set, lookup(this.#v)];
|
|
130
|
+
}
|
|
131
|
+
clone() {
|
|
132
|
+
return new SetRefElement(this.#v);
|
|
133
|
+
}
|
|
134
|
+
getDependencies() {
|
|
135
|
+
return this.#v ? [this.#v] : undefined;
|
|
136
|
+
}
|
|
137
|
+
values() {
|
|
138
|
+
return this.#v;
|
|
139
|
+
}
|
|
140
|
+
static fromJSON(elem, resolve) {
|
|
141
|
+
const values = resolve(elem[1]);
|
|
142
|
+
assert(values instanceof ArrayRefElement || values === undefined);
|
|
143
|
+
return new SetRefElement(values);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export class MapRefElement extends BaseRefElement {
|
|
147
|
+
#k;
|
|
148
|
+
#v;
|
|
149
|
+
constructor(keys, values) {
|
|
150
|
+
super();
|
|
151
|
+
this.#k = keys;
|
|
152
|
+
this.#v = values;
|
|
153
|
+
}
|
|
154
|
+
setKeysAndValues(keys, values) {
|
|
155
|
+
assert(keys.length === values.length);
|
|
156
|
+
this.#k = keys;
|
|
157
|
+
this.#v = values;
|
|
158
|
+
}
|
|
159
|
+
toElement(lookup) {
|
|
160
|
+
return [ElementType.Map, lookup(this.#k), lookup(this.#v)];
|
|
161
|
+
}
|
|
162
|
+
clone() {
|
|
163
|
+
return new MapRefElement(this.#k, this.#v);
|
|
164
|
+
}
|
|
165
|
+
getDependencies() {
|
|
166
|
+
return [this.#k, this.#v].filter((r) => !!r);
|
|
167
|
+
}
|
|
168
|
+
keys() {
|
|
169
|
+
return this.#k;
|
|
170
|
+
}
|
|
171
|
+
values() {
|
|
172
|
+
return this.#v;
|
|
173
|
+
}
|
|
174
|
+
static fromJSON(elem, resolve) {
|
|
175
|
+
const keys = resolve(elem[1]);
|
|
176
|
+
const values = resolve(elem[2]);
|
|
177
|
+
assert(keys instanceof ArrayRefElement || keys === undefined);
|
|
178
|
+
assert(values instanceof ArrayRefElement || values === undefined);
|
|
179
|
+
return new MapRefElement(keys, values);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
export class RegExpRefElement extends BaseRefElement {
|
|
183
|
+
#p;
|
|
184
|
+
#f;
|
|
185
|
+
constructor(pattern, flags) {
|
|
186
|
+
super();
|
|
187
|
+
this.#p = pattern;
|
|
188
|
+
this.#f = flags;
|
|
189
|
+
}
|
|
190
|
+
toElement(lookup) {
|
|
191
|
+
return [ElementType.RegExp, lookup(this.#p), lookup(this.#f)];
|
|
192
|
+
}
|
|
193
|
+
clone() {
|
|
194
|
+
return new RegExpRefElement(this.#p, this.#f);
|
|
195
|
+
}
|
|
196
|
+
getDependencies() {
|
|
197
|
+
return [this.#p, this.#f].filter((r) => !!r);
|
|
198
|
+
}
|
|
199
|
+
static fromJSON(elem, resolve) {
|
|
200
|
+
const pattern = resolve(elem[1]);
|
|
201
|
+
const flags = resolve(elem[2]);
|
|
202
|
+
assert(isStringRefElements(pattern) || pattern === undefined);
|
|
203
|
+
assert(isStringRefElements(flags) || flags === undefined);
|
|
204
|
+
return new RegExpRefElement(pattern, flags);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export class DateRefElement extends BaseRefElement {
|
|
208
|
+
#v;
|
|
209
|
+
constructor(value) {
|
|
210
|
+
super();
|
|
211
|
+
this.#v = value;
|
|
212
|
+
}
|
|
213
|
+
toElement() {
|
|
214
|
+
return [ElementType.Date, this.#v];
|
|
215
|
+
}
|
|
216
|
+
clone() {
|
|
217
|
+
return new DateRefElement(this.#v);
|
|
218
|
+
}
|
|
219
|
+
getDependencies() {
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
static fromJSON(value) {
|
|
223
|
+
return new DateRefElement(value[1]);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
export class BigIntRefElement extends BaseRefElement {
|
|
227
|
+
#v;
|
|
228
|
+
constructor(value) {
|
|
229
|
+
super();
|
|
230
|
+
this.#v = value;
|
|
231
|
+
}
|
|
232
|
+
toElement(lookup) {
|
|
233
|
+
return [ElementType.BigInt, lookup(this.#v)];
|
|
234
|
+
}
|
|
235
|
+
clone() {
|
|
236
|
+
return new BigIntRefElement(this.#v);
|
|
237
|
+
}
|
|
238
|
+
getDependencies() {
|
|
239
|
+
return [this.#v];
|
|
240
|
+
}
|
|
241
|
+
static fromJSON(elem, resolve) {
|
|
242
|
+
const value = resolve(elem[1]);
|
|
243
|
+
assert(value instanceof NumberRefElement || isStringRefElements(value));
|
|
244
|
+
return new BigIntRefElement(value);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
export class ArrayRefElement extends BaseRefElement {
|
|
248
|
+
#v;
|
|
249
|
+
#hash = 0;
|
|
250
|
+
constructor(values) {
|
|
251
|
+
super();
|
|
252
|
+
this.#v = values || [];
|
|
253
|
+
this.#updateHash();
|
|
254
|
+
}
|
|
255
|
+
get hash() {
|
|
256
|
+
return this.#hash;
|
|
257
|
+
}
|
|
258
|
+
#updateHash() {
|
|
259
|
+
if (!this.#v.length) {
|
|
260
|
+
this.#hash = 0;
|
|
261
|
+
}
|
|
262
|
+
this.#hash = simpleHash(this.#v.map((v) => v.id));
|
|
263
|
+
}
|
|
264
|
+
setValues(values) {
|
|
265
|
+
this.#v = values;
|
|
266
|
+
this.#updateHash();
|
|
267
|
+
}
|
|
268
|
+
valueRefs() {
|
|
269
|
+
return this.#v;
|
|
270
|
+
}
|
|
271
|
+
toElement(lookup) {
|
|
272
|
+
return [ElementType.Array, ...this.#v.map(lookup)];
|
|
273
|
+
}
|
|
274
|
+
get length() {
|
|
275
|
+
return this.#v.length;
|
|
276
|
+
}
|
|
277
|
+
isEqual(other) {
|
|
278
|
+
if (this.length !== other.length)
|
|
279
|
+
return false;
|
|
280
|
+
for (let i = 0; i < this.length; ++i) {
|
|
281
|
+
if (this.#v[i] !== other.#v[i])
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
clone() {
|
|
287
|
+
return new ArrayRefElement(this.#v);
|
|
288
|
+
}
|
|
289
|
+
getDependencies() {
|
|
290
|
+
return this.#v;
|
|
291
|
+
}
|
|
292
|
+
static fromJSON(elem, resolve) {
|
|
293
|
+
const values = elem.slice(1).map(resolve);
|
|
294
|
+
return new ArrayRefElement(values);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function simpleHash(values) {
|
|
298
|
+
let hash = Math.sqrt(values.length);
|
|
299
|
+
for (const value of values) {
|
|
300
|
+
hash += value * value;
|
|
301
|
+
}
|
|
302
|
+
return hash;
|
|
303
|
+
}
|
|
304
|
+
export class SubStringRefElement extends BaseRefElement {
|
|
305
|
+
#v;
|
|
306
|
+
#l;
|
|
307
|
+
#o;
|
|
308
|
+
constructor(value, len, offset) {
|
|
309
|
+
super();
|
|
310
|
+
this.#v = value;
|
|
311
|
+
this.#l = len;
|
|
312
|
+
this.#o = offset;
|
|
313
|
+
}
|
|
314
|
+
toElement(lookup) {
|
|
315
|
+
const elm = this.#o
|
|
316
|
+
? [ElementType.SubString, lookup(this.#v), this.#l, this.#o]
|
|
317
|
+
: [ElementType.SubString, lookup(this.#v), this.#l];
|
|
318
|
+
const v = this.value;
|
|
319
|
+
return JSON.stringify(elm).length < JSON.stringify(v).length ? elm : v;
|
|
320
|
+
}
|
|
321
|
+
get value() {
|
|
322
|
+
const offset = this.#o || 0;
|
|
323
|
+
const v = this.#v.value.slice(offset, offset + this.#l);
|
|
324
|
+
return v;
|
|
325
|
+
}
|
|
326
|
+
get length() {
|
|
327
|
+
return this.#l;
|
|
328
|
+
}
|
|
329
|
+
clone() {
|
|
330
|
+
return new SubStringRefElement(this.#v, this.#l, this.#o);
|
|
331
|
+
}
|
|
332
|
+
getDependencies() {
|
|
333
|
+
return [this.#v];
|
|
334
|
+
}
|
|
335
|
+
static fromJSON(elem, resolve) {
|
|
336
|
+
const idx = resolve(elem[1]);
|
|
337
|
+
assert(isStringRefElements(idx));
|
|
338
|
+
return new SubStringRefElement(idx, elem[2], elem[3]);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
export class StringConcatRefElement extends BaseRefElement {
|
|
342
|
+
#v;
|
|
343
|
+
#s = '';
|
|
344
|
+
#l = 0;
|
|
345
|
+
constructor(values) {
|
|
346
|
+
super();
|
|
347
|
+
this.#v = values;
|
|
348
|
+
}
|
|
349
|
+
toElement(lookup) {
|
|
350
|
+
const elem = [ElementType.String, ...this.#v.map(lookup)];
|
|
351
|
+
const v = this.value;
|
|
352
|
+
return JSON.stringify(elem).length < JSON.stringify(v).length ? elem : v;
|
|
353
|
+
}
|
|
354
|
+
get value() {
|
|
355
|
+
if (!this.#s) {
|
|
356
|
+
this.#s = this.#v.map((r) => r.value).join('');
|
|
357
|
+
}
|
|
358
|
+
return this.#s;
|
|
359
|
+
}
|
|
360
|
+
get length() {
|
|
361
|
+
if (!this.#l) {
|
|
362
|
+
this.#l = this.#v.reduce((acc, r) => acc + r.length, 0);
|
|
363
|
+
}
|
|
364
|
+
return this.#l;
|
|
365
|
+
}
|
|
366
|
+
clone() {
|
|
367
|
+
return new StringConcatRefElement(this.#v);
|
|
368
|
+
}
|
|
369
|
+
getDependencies() {
|
|
370
|
+
return this.#v;
|
|
371
|
+
}
|
|
372
|
+
static fromJSON(elem, resolve) {
|
|
373
|
+
const values = elem.slice(1).map(resolve).filter(isStringRefElements);
|
|
374
|
+
return new StringConcatRefElement(values);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
export function isStringRefElements(elem) {
|
|
378
|
+
return (elem instanceof SubStringRefElement ||
|
|
379
|
+
elem instanceof StringConcatRefElement ||
|
|
380
|
+
elem instanceof StringPrimitiveRefElement);
|
|
381
|
+
}
|
|
382
|
+
export function isPrimitiveRefElement(elem) {
|
|
383
|
+
return elem instanceof PrimitiveRefElementBase;
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=RefElements.mjs.map
|
package/dist/Trie.d.mts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class Trie<T> {
|
|
2
|
+
root: RootNode<T>;
|
|
3
|
+
add(key: string | Iterable<string>, data: T): void;
|
|
4
|
+
find(key: string | Iterable<string>): {
|
|
5
|
+
data: T | undefined;
|
|
6
|
+
found: string;
|
|
7
|
+
} | undefined;
|
|
8
|
+
}
|
|
9
|
+
type ChildMap<T> = Map<string, TrieNode<T>>;
|
|
10
|
+
interface TrieNode<T> {
|
|
11
|
+
d?: T | undefined;
|
|
12
|
+
c?: ChildMap<T>;
|
|
13
|
+
}
|
|
14
|
+
interface RootNode<T> extends TrieNode<T> {
|
|
15
|
+
d: undefined;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=Trie.d.mts.map
|
package/dist/Trie.mjs
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export class Trie {
|
|
2
|
+
root = { d: undefined, c: new Map() };
|
|
3
|
+
add(key, data) {
|
|
4
|
+
let node = this.root;
|
|
5
|
+
for (const k of key) {
|
|
6
|
+
let c = node.c;
|
|
7
|
+
if (!c) {
|
|
8
|
+
node.c = c = new Map();
|
|
9
|
+
}
|
|
10
|
+
let n = c.get(k);
|
|
11
|
+
if (!n) {
|
|
12
|
+
c.set(k, (n = { d: data }));
|
|
13
|
+
}
|
|
14
|
+
node = n;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
find(key) {
|
|
18
|
+
let node = this.root;
|
|
19
|
+
let found = '';
|
|
20
|
+
for (const k of key) {
|
|
21
|
+
const c = node.c;
|
|
22
|
+
if (!c) {
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
const n = c.get(k);
|
|
26
|
+
if (!n) {
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
found += k;
|
|
30
|
+
node = n;
|
|
31
|
+
}
|
|
32
|
+
return { data: node.d, found };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=Trie.mjs.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RefElements } from './RefElements.mjs';
|
|
2
|
+
import { Flatpacked, type FlattenedElement } from './types.mjs';
|
|
3
|
+
export declare function fromElement(elem: FlattenedElement, resolve: (index: number) => RefElements): RefElements;
|
|
4
|
+
export declare function fromFlatpacked(flat: Flatpacked): RefElements[];
|
|
5
|
+
export declare class FlatpackedWrapper {
|
|
6
|
+
readonly elements: Flatpacked;
|
|
7
|
+
constructor(elements: Flatpacked);
|
|
8
|
+
static parse(content: string): FlatpackedWrapper;
|
|
9
|
+
toRefElements(): RefElements[];
|
|
10
|
+
}
|
|
11
|
+
export declare function isFlatpacked(value: unknown): value is Flatpacked;
|
|
12
|
+
//# sourceMappingURL=flatpackUtil.d.mts.map
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { ArrayRefElement, BigIntRefElement, DateRefElement, MapRefElement, NumberRefElement, ObjectRefElement, ObjectWrapperRefElement, PrimitiveRefElement, RegExpRefElement, SetRefElement, StringConcatRefElement, StringPrimitiveRefElement, SubStringRefElement, } from './RefElements.mjs';
|
|
3
|
+
import { dataHeader, ElementType, } from './types.mjs';
|
|
4
|
+
export function fromElement(elem, resolve) {
|
|
5
|
+
function handleArrayElement(element) {
|
|
6
|
+
switch (element[0]) {
|
|
7
|
+
case ElementType.Array: {
|
|
8
|
+
break;
|
|
9
|
+
}
|
|
10
|
+
case ElementType.Object: {
|
|
11
|
+
if (element[1] === 0 && element[2]) {
|
|
12
|
+
return ObjectWrapperRefElement.fromJSON(element, resolve);
|
|
13
|
+
}
|
|
14
|
+
return ObjectRefElement.fromJSON(element, resolve);
|
|
15
|
+
}
|
|
16
|
+
case ElementType.String: {
|
|
17
|
+
return StringConcatRefElement.fromJSON(element, resolve);
|
|
18
|
+
}
|
|
19
|
+
case ElementType.SubString: {
|
|
20
|
+
return SubStringRefElement.fromJSON(element, resolve);
|
|
21
|
+
}
|
|
22
|
+
case ElementType.Set: {
|
|
23
|
+
return SetRefElement.fromJSON(element, resolve);
|
|
24
|
+
}
|
|
25
|
+
case ElementType.Map: {
|
|
26
|
+
return MapRefElement.fromJSON(element, resolve);
|
|
27
|
+
}
|
|
28
|
+
case ElementType.RegExp: {
|
|
29
|
+
return RegExpRefElement.fromJSON(element, resolve);
|
|
30
|
+
}
|
|
31
|
+
case ElementType.Date: {
|
|
32
|
+
return DateRefElement.fromJSON(element);
|
|
33
|
+
}
|
|
34
|
+
case ElementType.BigInt: {
|
|
35
|
+
return BigIntRefElement.fromJSON(element, resolve);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return ArrayRefElement.fromJSON(element, resolve);
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(elem)) {
|
|
41
|
+
return handleArrayElement(elem);
|
|
42
|
+
}
|
|
43
|
+
if (typeof elem === 'string') {
|
|
44
|
+
return StringPrimitiveRefElement.fromJSON(elem);
|
|
45
|
+
}
|
|
46
|
+
if (typeof elem === 'number') {
|
|
47
|
+
return NumberRefElement.fromJSON(elem);
|
|
48
|
+
}
|
|
49
|
+
if (typeof elem === 'object') {
|
|
50
|
+
if (elem === null) {
|
|
51
|
+
return PrimitiveRefElement.fromJSON(elem);
|
|
52
|
+
}
|
|
53
|
+
return new ObjectRefElement();
|
|
54
|
+
}
|
|
55
|
+
assert(typeof elem === 'boolean');
|
|
56
|
+
return PrimitiveRefElement.fromJSON(elem);
|
|
57
|
+
}
|
|
58
|
+
export function fromFlatpacked(flat) {
|
|
59
|
+
const elements = [];
|
|
60
|
+
const known = new Map();
|
|
61
|
+
function resolve(index) {
|
|
62
|
+
const found = known.get(index);
|
|
63
|
+
if (found)
|
|
64
|
+
return found;
|
|
65
|
+
const element = fromElement(flat[index], resolve);
|
|
66
|
+
known.set(index, element);
|
|
67
|
+
elements[index] = element;
|
|
68
|
+
element.setId(index);
|
|
69
|
+
return element;
|
|
70
|
+
}
|
|
71
|
+
elements[0] = new PrimitiveRefElement(undefined);
|
|
72
|
+
known.set(0, elements[0]);
|
|
73
|
+
for (let i = 1; i < flat.length; i++) {
|
|
74
|
+
resolve(i);
|
|
75
|
+
}
|
|
76
|
+
return elements;
|
|
77
|
+
}
|
|
78
|
+
export class FlatpackedWrapper {
|
|
79
|
+
elements;
|
|
80
|
+
constructor(elements) {
|
|
81
|
+
this.elements = elements;
|
|
82
|
+
}
|
|
83
|
+
static parse(content) {
|
|
84
|
+
const data = JSON.parse(content);
|
|
85
|
+
assert(isFlatpacked(data));
|
|
86
|
+
return new FlatpackedWrapper(data);
|
|
87
|
+
}
|
|
88
|
+
toRefElements() {
|
|
89
|
+
return fromFlatpacked(this.elements);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function isFlatpacked(value) {
|
|
93
|
+
return Array.isArray(value) && value[0] === dataHeader;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=flatpackUtil.mjs.map
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { FlatpackStore } from './Flatpack.mjs';
|
|
2
|
+
export { stringify, toJSON } from './storage.mjs';
|
|
3
|
+
export { stringifyFlatpacked } from './stringify.mjs';
|
|
4
|
+
export type { Flatpacked } from './types.mts';
|
|
5
|
+
export { fromJSON, parse } from './unpack.mjs';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|