url-safe-bitpacking 0.1.11 → 0.1.13

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/README.md CHANGED
@@ -11,16 +11,13 @@ Package for creating definitions of parametric models that can be stored as comp
11
11
  | updating model entries | ✓ | ✓ | |
12
12
  | re-using data from old model on change in definition | ½ | ¼ | |
13
13
  | flattening and reading of the objects | ✓ | ✓ | ¿ |
14
+ | arrays (both bit-level as arrays of objects) | ½ | ¼ | |
14
15
 
15
16
  ## concept
16
17
 
17
- The goal of this library is to offer a flexible, minimal and, variable object definition that can be stored in the browser URL. The main imagined use-case is parametric models that have nested and variable sub-object definitions.
18
+ The goal of this library is to offer a flexible, minimal and, variable object definition that can be stored in the browser URL. The main imagined use-case is parametric models that have nested and variable sub-object definitions. The library heavily relies on the bitpacking of custom bitwidth numeric values. Because of that, the biggest trade-off for this library is legibility. Without the related object definition, it would be impossible to reconstruct the state. The big advantage though is the ability to store rather many variables in a very condensed URL, allowing to store all information in rather short urls which then can be used for qr code generation.
18
19
 
19
- The library heavily relies on the bitpacking of custom bitwidth numeric values. Because of that, the biggest trade-off for this library is legibility. Without the related object definition, it would be impossible to reconstruct the state.
20
-
21
- The big advantage though is the ability to store rather many variables in a very condensed URL, allowing to store all information in rather short urls which then can be used for qr code generation.
22
-
23
- ## data types
20
+ ## bit-level data types
24
21
 
25
22
  Currently, there are 4 data types implemented (+1 special case for safety). All data entries have a name that will behave as an attribute name in the object.
26
23
 
@@ -64,11 +61,11 @@ There is also a Version object which is a special case of the enum data type and
64
61
  DataEntryFactory.createVersion(0, 8, 'version');
65
62
  ```
66
63
 
67
- ## attribute map
64
+ ## nested attribute definitions
68
65
 
69
- On a macro level there are two types of data. Either Single Level array objects or Double Nested array objects.
66
+ More often than not in parametric models, certain data belongs together. It can also happen that the specific state of some values will have an impact on other ones being present (or which ranges are allowed). To be able to deal with this there is the option to nest data. I tried to come with an as concise yet versatile way of defining the object definitions.
70
67
 
71
- Single-level nested objects are arrays in which the entries it contains describe themselves. The Double Nested arrays describe objects that will have a variable size, that depends on the linked data entry that is selected is set in state.
68
+ ### single nes
72
69
 
73
70
  For the Double Nested arrays there are currently two variations: either an Optional type, which only accepts two values of which is an empty array and will be toggle on/off in relation to a certain boolean data entry.
74
71
 
@@ -1,2 +1,5 @@
1
+ import { VersionRangeType } from '../types';
1
2
  export declare const getBitsForIntegerNumber: (number: number, maxBits: number) => number;
3
+ export declare const getMinimumBitsForInteger: (v: number) => number;
4
+ export declare const getVersionValueRangeValueForNumber: (v: number) => VersionRangeType;
2
5
  export declare const getMaxIntegerValueForGivenBitWidth: (bitCount: number) => number;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- export { ObjectGenerationOutputStatus, DataType } from './enums';
1
+ export { DataType } from './enums';
2
2
  export { DataEntryFactory } from './factory';
3
- export { createParserObject, parseUrl, updateDataEntry, getURLSafeBase64ForData, getSemanticallyNestedValues, getDefaultObject, getFlatArray, } from './objectmap';
4
- export {} from './parsers';
5
- export { SingleLevelContentType, NestedContentDataType, NestedContentType, DoubleLevelContentType, NonEmptyValidEntryArrayType, OptionalEntryDataType, EnumEntryDataType, VersionArrayDefinitionType, PrecisionRangeType, SignificandMaxBits, FloatData, IntegerMaxBits, IntData, VersionRangeType, VersionData, BooleanData, DataEntry, DataEntryArray, SemanticlyNestedDataEntry, ObjectGeneratorMethod, DefinitionGenerationObject, DefinitionNestedArray, DefinitionNestedGenerationObject, DefinitionSubObject, DefinitionArrayObject, VersionDefinitionObject, VersionEnumSemantics, ParserForVersion, ParsersForVersionObject, } from './types';
6
- export {} from './update';
3
+ export { SingleLevelContentType, NestedContentDataType, NestedContentType, DoubleLevelContentType, NonEmptyValidEntryArrayType, OptionalEntryDataType, EnumEntryDataType, PrecisionRangeType, SignificandMaxBits, FloatData, IntegerMaxBits, IntData, VersionRangeType, VersionData, BooleanData, DataEntry, DataEntryArray, StateDataType, StateValueType, EnumSemantics, } from './types';
4
+ export { createParserObject, getStateValue, getBase64String, getDataEntryArray } from './objectmap';
5
+ export { parseBase64ToBits } from './parsers';
7
6
  export { interpolateEntryAt, getRelativeValue } from './utils';
package/dist/index.js CHANGED
@@ -18,6 +18,14 @@ var ObjectGenerationOutputStatus;
18
18
  // src/types/floatData.ts
19
19
  var SignificandMaxBits = 20;
20
20
 
21
+ // src/types/arrayDefinitions.ts
22
+ var PREFIX_SEPERATOR_DELIMETER = "_";
23
+ // src/types/enumData.ts
24
+ var EnumMaxBits = 8;
25
+ // src/types/intData.ts
26
+ var IntegerMaxBits = 12;
27
+ // src/types/versionData.ts
28
+ var VersionRange = [4, 6, 8, 10];
21
29
  // src/factory/helperMethod.ts
22
30
  var getBitsForIntegerNumber = (number, maxBits) => {
23
31
  const bitCount = Math.ceil(Math.log2(number));
@@ -25,7 +33,14 @@ var getBitsForIntegerNumber = (number, maxBits) => {
25
33
  throw new Error(`Cannot get ${maxBits} bits for a number with ${bitCount} bits`);
26
34
  return bitCount;
27
35
  };
28
- var getMaxIntegerValueForGivenBitWidth = (bitCount) => 2 ** bitCount - 1;
36
+ var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v));
37
+ var getVersionValueRangeValueForNumber = (v) => {
38
+ const minBits = getMinimumBitsForInteger(v);
39
+ const versionBits = VersionRange.find((x) => x >= minBits);
40
+ if (versionBits === undefined)
41
+ throw new Error(`Cannot find version range for ${v}, max amount of versions allowed is ${2 ** VersionRange[VersionRange.length - 1]}`);
42
+ return versionBits;
43
+ };
29
44
 
30
45
  // src/factory/floatFactory.ts
31
46
  var create = (value, min = 0, max = 1, precision = 2, name = "", index = -1) => {
@@ -46,9 +61,6 @@ var create = (value, min = 0, max = 1, precision = 2, name = "", index = -1) =>
46
61
  };
47
62
  };
48
63
 
49
- // src/types/intData.ts
50
- var IntegerMaxBits = 12;
51
-
52
64
  // src/factory/intFactory.ts
53
65
  var create2 = (value, min = 0, max = 10, name = "", index = -1) => {
54
66
  if (!Number.isInteger(min) || !Number.isInteger(max))
@@ -73,9 +85,6 @@ var create4 = (value, bits = 8, name = "", index = -1) => ({
73
85
  index
74
86
  });
75
87
 
76
- // src/types/enumData.ts
77
- var EnumMaxBits = 8;
78
-
79
88
  // src/factory/enumFactory.ts
80
89
  var create5 = (value, max = 10, name = "", index = -1) => {
81
90
  if (!Number.isInteger(max))
@@ -96,67 +105,8 @@ var DataEntryFactory = {
96
105
  createBoolean: create3,
97
106
  createVersion: create4
98
107
  };
99
- // src/types/arrayDefinitions.ts
100
- var NAME_DELIMETER = "_";
101
-
102
- // src/objectmap/versionArrayDefinitionToObjectDefintion.ts
103
- var isSingleLevelContentType = (data) => singleLevelContentTypeIsDataEntry(data[0]) || singleLevelContentTypeIsNestedContentDataType(data[0]);
104
- var isDoubleLevelContentType = (data) => !isSingleLevelContentType(data);
105
- var singleLevelContentTypeIsDataEntry = (data) => !Array.isArray(data) && typeof data === "object";
106
- var singleLevelContentTypeIsNestedContentDataType = (data) => Array.isArray(data) && typeof data[0] === "string";
107
- var singleLevelContentTypeIsEnumEntryDataType = (data) => isDoubleLevelContentType(data) && typeof data[0] === "number";
108
- var singleLevelContentTypeIsOptionalEntryDataType = (data) => isDoubleLevelContentType(data) && typeof data[0] === "boolean";
109
- var parseSingleLevelContentTypeToDefinitionSubObject = (data, internalPrecedingName) => {
110
- if (singleLevelContentTypeIsDataEntry(data))
111
- return parseDataEntry(data, internalPrecedingName);
112
- else if (singleLevelContentTypeIsNestedContentDataType(data))
113
- return parseNestedContentDataTypeToDefinitionNestedArray(data, internalPrecedingName);
114
- else {
115
- throw new Error("this is an invalid output value, wonder why?");
116
- }
117
- };
118
- var parseNestedContentDataTypeToDefinitionNestedArray = (data, internalPrecedingName) => {
119
- const [attributeName, localData] = data;
120
- if (isSingleLevelContentType(localData))
121
- return [attributeName, localData.map((v) => parseSingleLevelContentTypeToDefinitionSubObject(v, internalPrecedingName))];
122
- else if (singleLevelContentTypeIsEnumEntryDataType(localData))
123
- return parseEnumEntryDataTypeToDefinitionNestedGenerationObject(localData, attributeName, internalPrecedingName);
124
- else if (singleLevelContentTypeIsOptionalEntryDataType(localData))
125
- return parseOptionalEntryDataTypeToDefinitionNestedGenerationObject(localData, attributeName, internalPrecedingName);
126
- else {
127
- throw new Error("this is an invalid output value, wonder why?");
128
- }
129
- };
130
- var parseEnumEntryDataTypeToDefinitionNestedGenerationObject = (data, name, internalPrecedingName) => {
131
- if (Math.round(data[0]) !== data[0])
132
- `given default (${data[0]}) value isn't an integer, rounding it`;
133
- if (data.length - 2 < Math.round(data[0]))
134
- console.log(`given default value (${data[0]}) was larger than the amount of options available, using the largest value (${data.length - 2}) instead`);
135
- if (data[0] < 0)
136
- console.log(`given default value (${data[0]}) was negative, using first index (0) instead`);
137
- const dataEntry = parseDataEntry(DataEntryFactory.createEnum(Math.max(Math.min(data.length - 2, Math.round(data[0])), 0), data.length - 2, name), internalPrecedingName);
138
- const generationMethod = (d) => [
139
- d,
140
- ...data[d.value + 1].map((v) => parseSingleLevelContentTypeToDefinitionSubObject(v, dataEntry.internalName))
141
- ];
142
- return [name, dataEntry, generationMethod];
143
- };
144
- var parseOptionalEntryDataTypeToDefinitionNestedGenerationObject = (data, name, internalPrecedingName) => {
145
- const dataEntry = parseDataEntry(DataEntryFactory.createBoolean(data[0], name), internalPrecedingName);
146
- const generationMethod = (d) => [
147
- d,
148
- ...data[Number(!d.value) + 1].map((v) => parseSingleLevelContentTypeToDefinitionSubObject(v, dataEntry.internalName))
149
- ];
150
- return [name, dataEntry, generationMethod];
151
- };
152
- var parseDataEntry = (d, internalPrecedingName) => internalPrecedingName ? { ...d, internalName: `${internalPrecedingName}${NAME_DELIMETER}${d.name}` } : d;
153
- var parseVersionArrayDefinitionTypeToVersionDefinitionObject = (v, optionalIndexOverwrite) => [
154
- optionalIndexOverwrite ? { ...parseDataEntry(v[0]), value: optionalIndexOverwrite } : parseDataEntry(v[0]),
155
- ...v.slice(1).map((d) => parseSingleLevelContentTypeToDefinitionSubObject(d, "_"))
156
- ];
157
-
158
108
  // src/parsers/intParser.ts
159
- var getBitsCount = (intData2) => intData2.bits;
109
+ var getBitsCount = (intData3) => intData3.bits;
160
110
  var rawValueParser = (stateString, bitCount) => {
161
111
  if (stateString.length < bitCount)
162
112
  throw new Error(`To few bits for this int bit string (${stateString.length} instead of ${bitCount})`);
@@ -167,9 +117,9 @@ var rawValueParser = (stateString, bitCount) => {
167
117
  throw new Error("Invalid int state string");
168
118
  return parsed;
169
119
  };
170
- var rawParser = (stateString, intData2) => {
171
- const v = rawValueParser(stateString, intData2.bits) + intData2.min;
172
- if (v > intData2.max)
120
+ var rawParser = (stateString, intData3) => {
121
+ const v = rawValueParser(stateString, intData3.bits) + intData3.min;
122
+ if (v > intData3.max)
173
123
  throw new Error("Value exceeds max");
174
124
  return v;
175
125
  };
@@ -178,16 +128,16 @@ var rawIntStringifier = (value, bitCount) => {
178
128
  throw new Error("Value is not an integer");
179
129
  return value.toString(2).padStart(bitCount, "0");
180
130
  };
181
- var rawStringifier = (value, intData2) => {
182
- if (value < intData2.min)
131
+ var rawStringifier = (value, intData3) => {
132
+ if (value < intData3.min)
183
133
  throw new Error("Value is below min");
184
- if (value > intData2.max)
134
+ if (value > intData3.max)
185
135
  throw new Error("Value exceeds max");
186
- return rawIntStringifier(value - intData2.min, intData2.bits);
136
+ return rawIntStringifier(value - intData3.min, intData3.bits);
187
137
  };
188
138
 
189
139
  // src/parsers/floatParser.ts
190
- var getBitsCount2 = (floatData2) => floatData2.significand;
140
+ var getBitsCount2 = (floatData3) => floatData3.significand;
191
141
  var rawValueParser2 = (stateString, significandBits, precision) => {
192
142
  if (stateString.length < significandBits)
193
143
  throw new Error(`To few bits for this float bit string (${stateString.length} instead of ${significandBits})`);
@@ -196,30 +146,30 @@ var rawValueParser2 = (stateString, significandBits, precision) => {
196
146
  const significand = rawValueParser(stateString, significandBits);
197
147
  return significand * 10 ** -precision;
198
148
  };
199
- var rawParser2 = (stateString, floatData2) => {
200
- const v = floatData2.min + rawValueParser2(stateString, floatData2.significand, floatData2.precision);
201
- if (v > floatData2.max)
149
+ var rawParser2 = (stateString, floatData3) => {
150
+ const v = floatData3.min + rawValueParser2(stateString, floatData3.significand, floatData3.precision);
151
+ if (v > floatData3.max)
202
152
  throw new Error("Float value exceeds max");
203
153
  return v;
204
154
  };
205
- var rawStringifier2 = (value, floatData2) => rawIntStringifier(Math.round((value - floatData2.min) * 10 ** floatData2.precision), floatData2.significand);
155
+ var rawStringifier2 = (value, floatData3) => rawIntStringifier(Math.round((value - floatData3.min) * 10 ** floatData3.precision), floatData3.significand);
206
156
 
207
157
  // src/parsers/enumParser.ts
208
- var getBitsCount3 = (versionData) => versionData.bits;
209
- var rawParser3 = (rawString, versionData) => rawValueParser(rawString, versionData.bits);
210
- var rawStringifier3 = (value, versionData) => {
211
- if (value > versionData.max)
158
+ var getBitsCount3 = (versionData2) => versionData2.bits;
159
+ var rawParser3 = (rawString, versionData2) => rawValueParser(rawString, versionData2.bits);
160
+ var rawStringifier3 = (value, versionData2) => {
161
+ if (value > versionData2.max)
212
162
  throw new Error("Version exceeds max");
213
- return rawIntStringifier(value, versionData.bits);
163
+ return rawIntStringifier(value, versionData2.bits);
214
164
  };
215
165
 
216
166
  // src/parsers/versionParser.ts
217
- var getBitsCount4 = (versionData) => versionData.bits;
218
- var rawParser4 = (rawString, versionData) => rawValueParser(rawString, versionData.bits);
219
- var rawStringifier4 = (value, versionData) => {
220
- if (value > 2 ** versionData.bits - 1)
167
+ var getBitsCount4 = (versionData2) => versionData2.bits;
168
+ var rawParser4 = (rawString, versionData2) => rawValueParser(rawString, versionData2.bits);
169
+ var rawStringifier4 = (value, versionData2) => {
170
+ if (value > 2 ** versionData2.bits - 1)
221
171
  throw new Error("Version exceeds max");
222
- return rawIntStringifier(value, versionData.bits);
172
+ return rawIntStringifier(value, versionData2.bits);
223
173
  };
224
174
 
225
175
  // src/parsers/booleanParser.ts
@@ -274,15 +224,10 @@ var getBitsCount6 = (mapData) => {
274
224
  return getBitsCount3(mapData);
275
225
  }
276
226
  };
277
- var dataBitsArrayParser = (bitString, mapDataArray) => {
278
- const bitCounts = mapDataArray.map((mapData) => getBitsCount6(mapData));
279
- const bitStartEndMap = [];
280
- bitCounts.forEach((bitCount, index) => {
281
- const start = index === 0 ? 0 : bitStartEndMap[index - 1][1];
282
- bitStartEndMap.push([start, start + bitCount]);
283
- });
284
- return mapDataArray.map((mapData, i) => dataBitsParser(bitString.slice(bitStartEndMap[i][0], bitStartEndMap[i][1]), mapData));
285
- };
227
+ var dataEntryBitstringParser = (bitstring, dataEntry2) => [
228
+ dataBitsParser(bitstring.slice(0, getBitsCount6(dataEntry2)), dataEntry2),
229
+ bitstring.slice(getBitsCount6(dataEntry2))
230
+ ];
286
231
  var dataBitsStringifier = (data) => {
287
232
  switch (data.type) {
288
233
  case DataType.BOOLEAN:
@@ -297,7 +242,7 @@ var dataBitsStringifier = (data) => {
297
242
  return rawStringifier3(data.value, data);
298
243
  }
299
244
  };
300
- var dataEntryCorrecting = (dataEntry) => dataBitsParser(dataBitsStringifier(dataEntry), dataEntry);
245
+ var dataEntryCorrecting = (dataEntry2) => dataBitsParser(dataBitsStringifier(dataEntry2), dataEntry2);
301
246
  var base64url = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
302
247
  var parseBitsToBase64 = (bits) => {
303
248
  const chunks = bits.match(/.{1,6}/g);
@@ -312,93 +257,6 @@ var parseBase64ToBits = (base64) => {
312
257
  var dataArrayStringifier = (dataEntryArray) => {
313
258
  return dataEntryArray.map(dataBitsStringifier).join("");
314
259
  };
315
-
316
- // src/objectmap/versionReading.ts
317
- var currentObjectIndex = -1;
318
- var nestedDataEntryArrayToObject = (definitionArrayObject) => {
319
- currentObjectIndex = -1;
320
- return internalNestedDataEntryArrayToObject(definitionArrayObject);
321
- };
322
- var internalNestedDataEntryArrayToObject = (definitionArrayObject) => {
323
- return Object.fromEntries(definitionArrayObject.map((value) => {
324
- if (Array.isArray(value)) {
325
- if (value.length === 2)
326
- return [value[0], internalNestedDataEntryArrayToObject(value[1])];
327
- else
328
- return [value[0], internalNestedDataEntryArrayToObject(value[2](value[1]))];
329
- }
330
- return [value.name, { ...value, index: ++currentObjectIndex }];
331
- }));
332
- };
333
- var definitionArrayObjectParser = (bitString, v) => {
334
- const [key, values] = v;
335
- const [nestedSemanticObject, objectGenerationStatus, localEndIndex] = parsingDefinitionArrayObject(bitString, values);
336
- return [[key, nestedSemanticObject], objectGenerationStatus, localEndIndex];
337
- };
338
- var methodParser = (bitString, v) => {
339
- const [key, keyDataDescription, methodGenerator] = v;
340
- const [keyDataEntry, status] = dataEntryParser(bitString, keyDataDescription, false);
341
- const [result, localStatus, localEndIndex] = definitionArrayObjectParser(bitString, [key, methodGenerator(keyDataEntry)]);
342
- return [result, localStatus !== ObjectGenerationOutputStatus.PARSED ? localStatus : status, localEndIndex];
343
- };
344
- var dataEntryParser = (bitString, v, iterate = true) => {
345
- const bitWidth = getBitsCount6(v);
346
- const value = iterate ? { ...dataBitsParser(bitString.slice(0, bitWidth), v), index: ++currentObjectIndex } : dataBitsParser(bitString.slice(0, bitWidth), v);
347
- return [value, ObjectGenerationOutputStatus.PARSED, bitWidth];
348
- };
349
- var parsingDefinitionArrayObject = (bitString, definitionArrayObject) => {
350
- let startIndex = 0;
351
- let objectGenerationStatus = ObjectGenerationOutputStatus.PARSED;
352
- return [
353
- Object.fromEntries(definitionArrayObject.map((value) => {
354
- if (Array.isArray(value)) {
355
- if (value.length === 2) {
356
- const [[key, nestedSemanticObject], status, localEndIndex] = definitionArrayObjectParser(bitString.slice(startIndex), value);
357
- startIndex += localEndIndex;
358
- ObjectGenerationOutputStatus.PARSED;
359
- return [key, nestedSemanticObject];
360
- } else {
361
- const [[key, nestedSemanticObject], status, localEndIndex] = methodParser(bitString.slice(startIndex), value);
362
- startIndex += localEndIndex;
363
- ObjectGenerationOutputStatus.PARSED;
364
- return [key, nestedSemanticObject];
365
- }
366
- } else {
367
- const [dataEntry, status, localEndIndex] = dataEntryParser(bitString.slice(startIndex), value);
368
- startIndex += localEndIndex;
369
- ObjectGenerationOutputStatus.PARSED;
370
- return [dataEntry.name, dataEntry];
371
- }
372
- })),
373
- objectGenerationStatus,
374
- startIndex
375
- ];
376
- };
377
- var parseUrlMethod = (url, parserVersions) => {
378
- currentObjectIndex = -1;
379
- const bitString = parseBase64ToBits(url);
380
- const version = dataBitsArrayParser(bitString, [DataEntryFactory.createVersion(0, parserVersions.versionBitCount)])[0];
381
- const versionParser = parserVersions.parsers[version.value];
382
- if (!versionParser)
383
- throw new Error(`No parser for version ${version.value}`);
384
- return parsingDefinitionArrayObject(bitString, versionParser.objectGeneratorParameters)[0];
385
- };
386
- var parseDownNestedDataDescription = (nestedDataDescription) => {
387
- const dataDescriptions = [];
388
- Object.values(nestedDataDescription).forEach((value) => {
389
- if (value.hasOwnProperty("type"))
390
- dataDescriptions.push(value);
391
- else
392
- dataDescriptions.push(...parseDownNestedDataDescription(value));
393
- });
394
- return dataDescriptions.sort();
395
- };
396
- var getURLForData = (data) => {
397
- const dataEntryArray = parseDownNestedDataDescription(data);
398
- const bitstring = dataArrayStringifier(dataEntryArray);
399
- return parseBitsToBase64(bitstring);
400
- };
401
-
402
260
  // src/update/floatUpdate.ts
403
261
  var updateValue = (original, update) => {
404
262
  const value = Math.max(Math.min(update.value, original.max), original.min);
@@ -458,100 +316,200 @@ var updateValue6 = (original, update) => {
458
316
  return updateValue4(original, update);
459
317
  }
460
318
  };
319
+ // src/objectmap/stateValueHelperMethods.ts
320
+ var flattenDerivativeStateDataType = (stateValue) => [
321
+ stateValue.s,
322
+ ...Array.isArray(stateValue.v) ? stateValue.v.map(getDataEntryArray).flat() : getDataEntryArray(stateValue.v)
323
+ ];
324
+ var internalGetDataEntryArray = (stateValue) => Object.values(stateValue).map((content) => {
325
+ if (content.type !== undefined)
326
+ return content;
327
+ else if (content.s !== undefined && content.v !== undefined) {
328
+ return flattenDerivativeStateDataType(content);
329
+ } else
330
+ return internalGetDataEntryArray(content);
331
+ }).flat();
332
+ var getStateValueHelperMethod = (stateValue) => {
333
+ if (stateValue.type !== undefined)
334
+ return stateValue.value;
335
+ else if (stateValue.s !== undefined && stateValue.v !== undefined)
336
+ return {
337
+ s: stateValue.s.value,
338
+ v: Array.isArray(stateValue.v) ? stateValue.v.map(getStateValue) : getStateValue(stateValue.v)
339
+ };
340
+ else
341
+ return getStateValue(stateValue);
342
+ };
343
+ var getStateValue = (stateValue) => Object.fromEntries(Object.entries(stateValue).map(([key, value]) => [key, getStateValueHelperMethod(value)]));
344
+ var getDataEntryArray = (stateValue) => internalGetDataEntryArray(stateValue).sort((a, b) => a.index - b.index);
345
+ var getBase64String = (stateValue) => parseBitsToBase64(dataArrayStringifier(getDataEntryArray(stateValue)));
346
+ var isSingleLevelContentType = (data) => singleLevelContentTypeIsDataEntry(data[0]) || singleLevelContentTypeIsNestedContentDataType(data[0]) && !doubleLevelContentTypeIsArrayDefinitionType(data);
347
+ var isDoubleLevelContentType = (data) => !isSingleLevelContentType(data);
348
+ var singleLevelContentTypeIsDataEntry = (data) => !Array.isArray(data) && typeof data === "object";
349
+ var singleLevelContentTypeIsNestedContentDataType = (data) => Array.isArray(data) && typeof data[0] === "string";
350
+ var doubleLevelContentTypeIsEnumEntryDataType = (data) => isDoubleLevelContentType(data) && typeof data[0] === "number";
351
+ var doubleLevelContentTypeIsOptionalEntryDataType = (data) => isDoubleLevelContentType(data) && typeof data[0] === "boolean";
352
+ var doubleLevelContentTypeIsArrayDefinitionType = (data) => Array.isArray(data[0]) && data[0].length === 2 && typeof data[0][0] === "number" && typeof data[0][1] === "number";
461
353
 
462
- // src/objectmap/versionUpdate.ts
463
- var currentObjectIndex2 = 0;
464
- var findExistingDataEntry = (dataEntry, dataEntryArray) => {
465
- const dataEntryName = dataEntry.internalName ?? dataEntry.name;
466
- return dataEntryArray.find((d) => (d.internalName ?? d.name) === dataEntryName);
467
- };
468
- var dataEntryUpdating = (dataEntry, dataEntryArray) => {
469
- const existingDataEntry = findExistingDataEntry(dataEntry, dataEntryArray);
470
- if (!existingDataEntry)
471
- return [dataEntry.name, { ...dataEntry, index: currentObjectIndex2++ }];
472
- return [dataEntry.name, { ...updateValue6(dataEntry, existingDataEntry), index: currentObjectIndex2++ }];
473
- };
474
- var nestedDataEntryArrayUpdating = (definitionNestedArrray, dataEntryArray) => {
475
- const [keyString, nestedDefinitionArray] = definitionNestedArrray;
476
- return [keyString, updateDataEntryObject(nestedDefinitionArray, dataEntryArray)];
477
- };
478
- var generationObjectUpdating = (definitionArrayObject, dataEntryArray) => {
479
- const [keyString, keyDataEntry, methodGenerator] = definitionArrayObject;
480
- const foundKeyDataEntry = findExistingDataEntry(keyDataEntry, dataEntryArray);
481
- const newKeyData = foundKeyDataEntry ? updateValue6(keyDataEntry, foundKeyDataEntry) : keyDataEntry;
482
- return [keyString, updateDataEntryObject(methodGenerator(newKeyData), dataEntryArray)];
483
- };
484
- var updateDataEntryObject = (definitionArrayObject, dataArray) => {
485
- const newNestedObject = {};
486
- definitionArrayObject.forEach((value) => {
487
- if (Array.isArray(value)) {
488
- if (value.length === 2) {
489
- const [keyString, nestedDataEntry] = nestedDataEntryArrayUpdating(value, dataArray);
490
- newNestedObject[keyString] = nestedDataEntry;
491
- } else {
492
- const [keyString, nestedDataEntry] = generationObjectUpdating(value, dataArray);
493
- newNestedObject[keyString] = nestedDataEntry;
354
+ // src/objectmap/stateDataModel.ts
355
+ var currentDataEntryIndex = 0;
356
+ var findExistingDataEntry = (dataEntry2, dataEntryArray) => dataEntryArray.find((d) => (d.internalName ?? d.name) === (dataEntry2.internalName ?? dataEntry2.name));
357
+ var readDataEntry = (dataEntry2, bitString) => {
358
+ const [d, slicedBitstring] = dataEntryBitstringParser(bitString, dataEntry2);
359
+ currentDataEntryIndex++;
360
+ return [slicedBitstring, [d.name, { ...d, index: currentDataEntryIndex }]];
361
+ };
362
+ var updateDataEntry = (dataEntry2, existingData) => {
363
+ const existingDataEntry = findExistingDataEntry(dataEntry2, existingData);
364
+ currentDataEntryIndex++;
365
+ return [existingData, [dataEntry2.name, { ...existingDataEntry ? updateValue6(dataEntry2, existingDataEntry) : dataEntry2, index: currentDataEntryIndex }]];
366
+ };
367
+ var internalGetDataEntry = (dataEntry2, prefix, additionalData) => {
368
+ const internalName = `${prefix}${PREFIX_SEPERATOR_DELIMETER}${dataEntry2.name}`;
369
+ const localDataEntry = { ...dataEntry2, internalName };
370
+ if (additionalData) {
371
+ if (typeof additionalData === "string")
372
+ return readDataEntry(localDataEntry, additionalData);
373
+ else
374
+ return updateDataEntry(localDataEntry, additionalData);
375
+ }
376
+ currentDataEntryIndex++;
377
+ return [undefined, [localDataEntry.name, { ...localDataEntry, index: currentDataEntryIndex }]];
378
+ };
379
+ var getStateFromOptionalEntryDataType = (oedt, prefix, attributeName) => (additionalData) => {
380
+ const [updatedLocalAdditionalData, [__, s]] = internalGetDataEntry(DataEntryFactory.createBoolean(oedt[0], attributeName), prefix, additionalData);
381
+ const [localAdditionalData, [_, v]] = getStateDateFromSingleLevelContentTypeArray(oedt[Number(s.value) + 1], s.internalName, attributeName)(updatedLocalAdditionalData);
382
+ return [
383
+ localAdditionalData,
384
+ [
385
+ attributeName,
386
+ {
387
+ s,
388
+ v
494
389
  }
495
- } else {
496
- const [key, dataEntry] = dataEntryUpdating(value, dataArray);
497
- newNestedObject[key] = dataEntry;
498
- }
499
- });
500
- return newNestedObject;
501
- };
502
- var updateDataEntry = (data, newDataEntry, parsersForVersion) => {
503
- currentObjectIndex2 = 0;
504
- const version = data.version;
505
- const versionParser = parsersForVersion[version.value];
506
- if (!versionParser)
507
- throw new Error(`No parser for version ${version.value}`);
508
- const correctedDataEntry = dataEntryCorrecting(newDataEntry);
509
- const dataEntryArray = parseDownNestedDataDescription(data);
510
- const virginDataEntryArray = [correctedDataEntry, ...dataEntryArray];
511
- return updateDataEntryObject(versionParser.objectGeneratorParameters, virginDataEntryArray);
390
+ ]
391
+ ];
512
392
  };
513
-
514
- // src/objectmap/versionUserMethods.ts
515
- var createParserObject = (versionArray, versionBitCount, enumSemanticsMapping, attributeSemanticsMapping) => {
516
- const maxAllowedParsers = getMaxIntegerValueForGivenBitWidth(versionBitCount);
517
- if (versionArray.length > maxAllowedParsers)
518
- throw new Error(`Cannot have more than ${maxAllowedParsers} versions`);
393
+ var getStateFromEnumEntryDataType = (eedt, prefix, attributeName) => (additionalData) => {
394
+ if (Math.round(eedt[0]) !== eedt[0])
395
+ `given default (${eedt[0]}) value isn't an integer, rounding it`;
396
+ if (eedt.length - 2 < Math.round(eedt[0]))
397
+ console.log(`given default value (${eedt[0]}) was larger than the amount of options available, using the largest value (${eedt.length - 2}) instead`);
398
+ if (eedt[0] < 0)
399
+ console.log(`given default value (${eedt[0]}) was negative, using first index (0) instead`);
400
+ const [updatedLocalAdditionalData, [__, s]] = internalGetDataEntry(DataEntryFactory.createEnum(Math.max(Math.min(eedt.length - 2, Math.round(eedt[0])), 0), eedt.length - 1, attributeName), prefix, additionalData);
401
+ const [nestedAdditionalData, [_, v]] = getStateDateFromSingleLevelContentTypeArray(eedt[1 + s.value], s.internalName, attributeName)(updatedLocalAdditionalData);
402
+ return [
403
+ nestedAdditionalData,
404
+ [
405
+ attributeName,
406
+ {
407
+ s,
408
+ v
409
+ }
410
+ ]
411
+ ];
412
+ };
413
+ var getStateFromArrayEntryDataType = (aedt, prefix, attributeName) => (additionalData) => {
414
+ const [min, max] = [aedt[0][0], aedt[0][1]].sort((a, b) => a - b);
415
+ const [updatedAdditionalData, [__, s]] = internalGetDataEntry(DataEntryFactory.createInt(min, min, max, attributeName), prefix, additionalData);
416
+ const v = [];
417
+ let localAdditionalData = updatedAdditionalData;
418
+ for (let i = 0;i < s.value; i++) {
419
+ const [updateAdditionalData, [_, localStateData]] = getStateDateFromSingleLevelContentTypeArray(aedt[1], `${s.internalName}${PREFIX_SEPERATOR_DELIMETER}${i}`, attributeName)(localAdditionalData);
420
+ localAdditionalData = updateAdditionalData;
421
+ v.push(localStateData);
422
+ }
423
+ return [
424
+ localAdditionalData,
425
+ [
426
+ attributeName,
427
+ {
428
+ s,
429
+ v
430
+ }
431
+ ]
432
+ ];
433
+ };
434
+ var getStateDataFromDoubleLevelContentType = (dct, prefix, attributeName) => {
435
+ if (doubleLevelContentTypeIsEnumEntryDataType(dct))
436
+ return getStateFromEnumEntryDataType(dct, prefix, attributeName);
437
+ else if (doubleLevelContentTypeIsOptionalEntryDataType(dct))
438
+ return getStateFromOptionalEntryDataType(dct, prefix, attributeName);
439
+ else if (doubleLevelContentTypeIsArrayDefinitionType(dct))
440
+ return getStateFromArrayEntryDataType(dct, prefix, attributeName);
441
+ throw new Error("this is an invalid output value, wonder why?");
442
+ };
443
+ var getStateDateFromSingleLevelContentTypeArray = (slcta, prefix, attributeName) => (additionalData) => {
444
+ const outputDataObject = {};
445
+ let intermediateAdditionalData = additionalData;
446
+ slcta.forEach((slct) => {
447
+ const [localAdditionalData, [localAttributeName, nestedData]] = getStateDataFromSingleLevelContentType(slct, prefix)(intermediateAdditionalData);
448
+ intermediateAdditionalData = localAdditionalData;
449
+ outputDataObject[localAttributeName] = nestedData;
450
+ });
451
+ return [intermediateAdditionalData, [attributeName, outputDataObject]];
452
+ };
453
+ var getStateDataFromNestedContentType = (nct, prefix, attributeName) => {
454
+ if (isDoubleLevelContentType(nct))
455
+ return getStateDataFromDoubleLevelContentType(nct, `${prefix}${PREFIX_SEPERATOR_DELIMETER}${attributeName}`, attributeName);
456
+ return getStateDateFromSingleLevelContentTypeArray(nct, prefix, attributeName);
457
+ };
458
+ var getStateDataFromSingleLevelContentType = (slct, prefix) => {
459
+ if (singleLevelContentTypeIsDataEntry(slct))
460
+ return (additionalData) => internalGetDataEntry(slct, prefix, additionalData);
461
+ else if (singleLevelContentTypeIsNestedContentDataType(slct))
462
+ return getStateDataFromNestedContentType(slct[1], prefix, slct[0]);
463
+ throw new Error("this is an invalid output value, wonder why?");
464
+ };
465
+ var getGenerationMethodForSingleLevelContentTypeArray = (slct) => {
466
+ currentDataEntryIndex = -1;
467
+ return (additionalData) => getStateDateFromSingleLevelContentTypeArray(slct, "", "")(additionalData)[1][1];
468
+ };
469
+ // src/objectmap/userMethods.ts
470
+ var getParsedAdditionalData = (additionalData) => {
471
+ if (typeof additionalData === "string")
472
+ return parseBase64ToBits(additionalData);
473
+ if (additionalData && !Array.isArray(additionalData))
474
+ return getDataEntryArray(additionalData);
475
+ return additionalData;
476
+ };
477
+ var getVersionindex = (additionalData, versionMask, defaultIndex) => {
478
+ if (typeof additionalData === "string")
479
+ return readDataEntry(versionMask, additionalData)[1][1].value;
480
+ if (!additionalData)
481
+ return defaultIndex || 0;
482
+ return additionalData.find((d) => d.name === "version")?.value ?? defaultIndex ?? 0;
483
+ };
484
+ var getParserMethodForVersionDefinition = (vadt, versionBits, defaultVersion) => (state) => {
485
+ const additionalData = getParsedAdditionalData(state);
486
+ const versionIndex = getVersionindex(additionalData, DataEntryFactory.createVersion(0, versionBits, "version"), defaultVersion);
487
+ const versionDefinition = vadt[versionIndex];
488
+ const versionEntry = DataEntryFactory.createVersion(versionIndex, versionBits, "version");
489
+ return getGenerationMethodForSingleLevelContentTypeArray([versionEntry, ...versionDefinition])(additionalData);
490
+ };
491
+ var getUpdaterMethodForVersionDefinition = (parser) => (state, entryToUpdate) => parser([entryToUpdate, ...getDataEntryArray(state)]);
492
+ var getStringifyMethodForVersionDefinition = (parser) => (data) => getBase64String(parser(data));
493
+ var createParserObject = (versionContent, maximumExpectedVersions, defaultVersion, enumSemanticsMapping, attributeSemanticsMapping, exposedVersions) => {
494
+ const versionBitCount = getVersionValueRangeValueForNumber(maximumExpectedVersions);
495
+ const localDefaultVersion = Math.max(0, Math.min(versionContent.length - 1, defaultVersion ?? 0));
496
+ if (versionContent.length > maximumExpectedVersions)
497
+ throw new Error(`Cannot have more than ${maximumExpectedVersions} versions`);
498
+ if (localDefaultVersion !== (defaultVersion ?? 0))
499
+ console.log(`Default version must be between 0 and ${versionContent.length - 1}, instead of ${defaultVersion} will be using ${localDefaultVersion}`);
500
+ const parser = getParserMethodForVersionDefinition(versionContent, versionBitCount, localDefaultVersion);
501
+ const updater = getUpdaterMethodForVersionDefinition(parser);
502
+ const stringify = getStringifyMethodForVersionDefinition(parser);
519
503
  return {
520
504
  versionBitCount,
521
- parsers: versionArray.map((version, index) => ({
522
- attributeSemanticsMapping: attributeSemanticsMapping ? Array.isArray(attributeSemanticsMapping) ? attributeSemanticsMapping[index] : attributeSemanticsMapping : undefined,
523
- enumSemanticsMapping: enumSemanticsMapping ? Array.isArray(enumSemanticsMapping) ? enumSemanticsMapping[index] : enumSemanticsMapping : undefined,
524
- objectGeneratorParameters: parseVersionArrayDefinitionTypeToVersionDefinitionObject(version, index)
525
- }))
505
+ exposedVersions,
506
+ parser,
507
+ updater,
508
+ stringify,
509
+ enumSemanticsMapping,
510
+ attributeSemanticsMapping
526
511
  };
527
512
  };
528
- var parseUrl = (urlSafeBase64, parserVersions) => parseUrlMethod(urlSafeBase64, parserVersions);
529
- var updateDataEntry2 = (updatedEntry, currentObject, parserVersions) => updateDataEntry(currentObject, updatedEntry, parserVersions.parsers);
530
- var getURLSafeBase64ForData = (data) => getURLForData(data);
531
- var internalParseDataEntry = (data, enumSemanticsMapping) => {
532
- if (data.type === DataType.ENUM && enumSemanticsMapping) {
533
- const mapping = enumSemanticsMapping[data.name]?.find((entry) => entry.value === data.value);
534
- if (mapping)
535
- return mapping.label;
536
- }
537
- return data.value;
538
- };
539
- var internalStrictSemanticallyNestedValues = (data, enumSemanticsMapping, attributeSemanticsMapping) => Object.fromEntries(Object.entries(data).map(([key, value]) => [
540
- attributeSemanticsMapping ? attributeSemanticsMapping[key] ?? key : key,
541
- value.type !== undefined ? internalParseDataEntry(value, enumSemanticsMapping) : internalStrictSemanticallyNestedValues(value, enumSemanticsMapping, attributeSemanticsMapping)
542
- ]));
543
- var getSemanticallyNestedValues = (data, parserVersions) => {
544
- const versionNumber = data.version.value;
545
- const enumSemanticsMapping = parserVersions.parsers[versionNumber]?.enumSemanticsMapping;
546
- const attributeSemanticsMapping = parserVersions.parsers[versionNumber]?.attributeSemanticsMapping;
547
- return internalStrictSemanticallyNestedValues(data, enumSemanticsMapping, attributeSemanticsMapping);
548
- };
549
- var getDefaultObject = (parserForVersions, versionindex) => {
550
- if (!parserForVersions.parsers[versionindex])
551
- throw new Error(`No parser for version ${versionindex} index`);
552
- return nestedDataEntryArrayToObject(parserForVersions.parsers[versionindex].objectGeneratorParameters);
553
- };
554
- var getFlatArray = (data) => parseDownNestedDataDescription(data);
555
513
  // src/utils/interpolateData.ts
556
514
  var interpolateEntryAt = (dataEntry2, t) => {
557
515
  const localT = Math.max(Math.min(1, t), 0);
@@ -585,17 +543,14 @@ var getRelativeValue = (dataEntry2) => {
585
543
  }
586
544
  };
587
545
  export {
588
- updateDataEntry2 as updateDataEntry,
589
- parseUrl,
546
+ parseBase64ToBits,
590
547
  interpolateEntryAt,
591
- getURLSafeBase64ForData,
592
- getSemanticallyNestedValues,
548
+ getStateValue,
593
549
  getRelativeValue,
594
- getFlatArray,
595
- getDefaultObject,
550
+ getDataEntryArray,
551
+ getBase64String,
596
552
  createParserObject,
597
553
  SignificandMaxBits,
598
- ObjectGenerationOutputStatus,
599
554
  IntegerMaxBits,
600
555
  DataType,
601
556
  DataEntryFactory
@@ -1 +1,4 @@
1
- export * from './versionUserMethods';
1
+ export * from './stateDataModel';
2
+ export * from './userMethods';
3
+ export * from './userMethods';
4
+ export * from './stateValueHelperMethods';
@@ -0,0 +1,19 @@
1
+ import { DataEntry, DataEntryArray, NestedContentType, SingleLevelContentType, DoubleLevelContentType, ArrayEntryDataType, EnumEntryDataType, OptionalEntryDataType, DataEntryParsingReturnType, DerivativeStateDataType, InternalStateDataGenerationMethod, StateDataGenerationMethod, StateDataType } from '../types';
2
+ /**
3
+ * Helper method for finding an existing data entry in case there was a previous object
4
+ * @param dataEntry - new DataEntry
5
+ * @param dataEntryArray - existing DataEntryArray
6
+ */
7
+ export declare const findExistingDataEntry: (dataEntry: DataEntry, dataEntryArray: DataEntryArray) => DataEntry | undefined;
8
+ export declare const readDataEntry: (dataEntry: DataEntry, bitString: string) => DataEntryParsingReturnType;
9
+ export declare const updateDataEntry: (dataEntry: DataEntry, existingData: DataEntryArray) => DataEntryParsingReturnType;
10
+ export declare const internalGetDataEntry: (dataEntry: DataEntry, prefix: string, additionalData?: DataEntryArray | string) => [DataEntryArray | string | undefined, [string, DataEntry]];
11
+ export declare const getStateFromOptionalEntryDataType: (oedt: OptionalEntryDataType, prefix: string, attributeName: string) => InternalStateDataGenerationMethod;
12
+ export declare const getStateFromEnumEntryDataType: (eedt: EnumEntryDataType, prefix: string, attributeName: string) => (additionalData?: DataEntryArray | string) => [DataEntryArray | string | undefined, [string, StateDataType]];
13
+ export declare const getStateFromArrayEntryDataType: (aedt: ArrayEntryDataType, prefix: string, attributeName: string) => (additionalData?: DataEntryArray | string) => [DataEntryArray | string | undefined, [string, DerivativeStateDataType]];
14
+ export declare const getStateDataFromDoubleLevelContentType: (dct: DoubleLevelContentType, prefix: string, attributeName: string) => InternalStateDataGenerationMethod;
15
+ export declare const getStateDateFromSingleLevelContentTypeArray: (slcta: SingleLevelContentType[], prefix: string, attributeName: string) => (additionalData?: DataEntryArray | string) => [DataEntryArray | string | undefined, [string, StateDataType]];
16
+ export declare const getStateDataFromNestedContentType: (nct: NestedContentType, prefix: string, attributeName: string) => InternalStateDataGenerationMethod;
17
+ export declare const getStateDataFromSingleLevelContentType: (slct: SingleLevelContentType, prefix: string) => InternalStateDataGenerationMethod;
18
+ export declare const getGenerationMethodForSingleLevelContentTypeArray: (slct: SingleLevelContentType[]) => StateDataGenerationMethod;
19
+ export declare const testOnlyResetCurrentDataEntryIndex: () => number;
@@ -0,0 +1,13 @@
1
+ import { DataEntryArray, NestedContentType, SingleLevelContentType } from '../types';
2
+ import { StateDataType, StateValueType } from '../types/stateValueModel';
3
+ export declare const getStateValue: (stateValue: StateDataType) => StateValueType;
4
+ export declare const getDataEntryArray: (stateValue: StateDataType) => DataEntryArray;
5
+ export declare const getBase64String: (stateValue: StateDataType) => string;
6
+ export declare const isSingleLevelContentType: (data: NestedContentType) => boolean;
7
+ export declare const isDoubleLevelContentType: (data: NestedContentType) => boolean;
8
+ export declare const singleLevelContentTypeIsDataEntry: (data: SingleLevelContentType) => boolean;
9
+ export declare const singleLevelContentTypeIsNestedContentDataType: (data: SingleLevelContentType) => boolean;
10
+ export declare const doubleLevelContentTypeIsEnumEntryDataType: (data: NestedContentType) => boolean;
11
+ export declare const doubleLevelContentTypeIsOptionalEntryDataType: (data: NestedContentType) => boolean;
12
+ export declare const doubleLevelContentTypeIsArrayDefinitionType: (data: NestedContentType) => boolean;
13
+ export declare const isDataEntry: (v: any) => boolean;
@@ -0,0 +1,12 @@
1
+ import { EnumSemantics, VersionHandler, VersionContentDefinition } from '../types';
2
+ /**
3
+ * Method to create version definition objects
4
+ * @param {VersionArrayDefinitionType[]} versionContent - version definition array
5
+ * @param {number} maximumExpectedVersions - maximum expected versions to define
6
+ * @param {number} defaultVersion - number - optional, default it is the first,
7
+ * @param {EnumSemantics[] | EnumSemantics} enumSemanticsMapping - optional - UI semantics mapping for enums. If not given, values will be numbers
8
+ * @param {undefined | Record<string, string> | Record<string, string>[]} attributeSemanticsMapping - optional - UI semantics mapping, if nothing given no semantics will be mapped
9
+ * @param {number[]} exposedVersions?: number[] - optional - UI semantics, masks which objects to show and hide
10
+ * @returns ParsersForVersionObject
11
+ */
12
+ export declare const createParserObject: (versionContent: VersionContentDefinition, maximumExpectedVersions: number, defaultVersion?: number, enumSemanticsMapping?: EnumSemantics | EnumSemantics[], attributeSemanticsMapping?: Record<string, string> | Record<string, string>[], exposedVersions?: number[]) => VersionHandler;
@@ -2,6 +2,7 @@ import { DataEntryArray, DataEntry } from '../types/dataEntry';
2
2
  export declare const valueBitsParser: (bitString: string, mapData: DataEntry) => number | boolean;
3
3
  export declare const dataBitsParser: (rawString: string, mapData: DataEntry) => DataEntry;
4
4
  export declare const getBitsCount: (mapData: DataEntry) => number;
5
+ export declare const dataEntryBitstringParser: (bitstring: string, dataEntry: DataEntry) => [DataEntry, string];
5
6
  /**
6
7
  * Method to convert a bitstring into an array of data entries
7
8
  * @param bitString bitstring to parse into bits and then data entries
@@ -1,10 +1,10 @@
1
- import { DataEntry, VersionDataEntry } from './dataEntry';
1
+ import { DataEntry } from './dataEntry';
2
2
  export type SingleLevelContentType = DataEntry | NestedContentDataType;
3
3
  export type NestedContentDataType = [string, NestedContentType];
4
4
  export type NestedContentType = SingleLevelContentType[] | DoubleLevelContentType;
5
- export type DoubleLevelContentType = OptionalEntryDataType | EnumEntryDataType;
5
+ export type DoubleLevelContentType = OptionalEntryDataType | EnumEntryDataType | ArrayEntryDataType;
6
6
  export type NonEmptyValidEntryArrayType = [SingleLevelContentType, ...SingleLevelContentType[]];
7
7
  export type OptionalEntryDataType = [boolean, NonEmptyValidEntryArrayType, []] | [boolean, [], NonEmptyValidEntryArrayType];
8
8
  export type EnumEntryDataType = [number, NonEmptyValidEntryArrayType, NonEmptyValidEntryArrayType, ...SingleLevelContentType[][]];
9
- export type VersionArrayDefinitionType = [VersionDataEntry, ...SingleLevelContentType[]];
10
- export declare const NAME_DELIMETER = "_";
9
+ export type ArrayEntryDataType = [[number, number], NonEmptyValidEntryArrayType];
10
+ export declare const PREFIX_SEPERATOR_DELIMETER = "_";
@@ -1,9 +1,9 @@
1
+ export * from './arrayDefinitions';
1
2
  export * from './booleanData';
2
3
  export * from './dataEntry';
3
4
  export * from './enumData';
4
5
  export * from './floatData';
5
6
  export * from './intData';
6
- export * from './semanticlyNestedDataEntry';
7
+ export * from './semanticMapping';
8
+ export * from './stateValueModel';
7
9
  export * from './versionData';
8
- export * from './versionParser';
9
- export * from './arrayDefinitions';
@@ -0,0 +1,6 @@
1
+ export type EnumSemantics = {
2
+ [dataEntryName: string]: {
3
+ value: number;
4
+ label: string;
5
+ }[];
6
+ };
@@ -0,0 +1,33 @@
1
+ import { SingleLevelContentType } from './arrayDefinitions';
2
+ import { DataEntry, DataEntryArray } from './dataEntry';
3
+ import { EnumSemantics } from './semanticMapping';
4
+ export type StateDataType = {
5
+ [attribute: string]: DataEntry | StateDataType | DerivativeStateDataType;
6
+ };
7
+ export type DerivativeStateDataType = {
8
+ s: DataEntry;
9
+ v: StateDataType | StateDataType[];
10
+ };
11
+ export type StateValueType = {
12
+ [attribute: string]: boolean | number | string | StateValueType | DerivativeStateValueType;
13
+ };
14
+ export type DerivativeStateValueType = {
15
+ s: boolean | number | string;
16
+ v: StateValueType | StateValueType[];
17
+ };
18
+ export type StateDataGenerationMethod = (additionalData?: DataEntryArray | string) => StateDataType;
19
+ export type DataEntryParsingReturnType = [DataEntryArray | string | undefined, [string, DataEntry]];
20
+ export type InternalStateDataGenerationMethod = (additionalData?: DataEntryArray | string) => [DataEntryArray | string | undefined, [string, DataEntry | StateDataType | DerivativeStateDataType]];
21
+ export type ExposedParserStateDataMethod = (additionalData?: StateDataType | DataEntryArray | string) => StateDataType;
22
+ export type UpdateStateDataMethod = (state: StateDataType, entryToUpdate: DataEntry) => StateDataType;
23
+ export type StringifyStateDataMethod = (data: StateDataType | DataEntryArray) => string;
24
+ export type VersionContentDefinition = SingleLevelContentType[][];
25
+ export type VersionHandler = {
26
+ versionBitCount: number;
27
+ exposedVersions?: number[];
28
+ enumSemanticsMapping?: EnumSemantics | EnumSemantics[];
29
+ attributeSemanticsMapping?: Record<string, string> | Record<string, string>[];
30
+ parser: ExposedParserStateDataMethod;
31
+ updater: UpdateStateDataMethod;
32
+ stringify: StringifyStateDataMethod;
33
+ };
@@ -1,5 +1,6 @@
1
1
  import { DataType } from '../enums/dataTypes';
2
2
  export type VersionRangeType = 4 | 6 | 8 | 10;
3
+ export declare const VersionRange: VersionRangeType[];
3
4
  export type VersionData = {
4
5
  type: DataType.VERSION;
5
6
  value: number;
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "dist/*"
7
7
  ],
8
8
  "type": "module",
9
- "version": "0.1.11",
9
+ "version": "0.1.13",
10
10
  "author": "Jonas Ward",
11
11
  "description": "Library for creating web safe base64 objects with custom bith widths and dynamic values.",
12
12
  "scripts": {
@@ -1,14 +0,0 @@
1
- import { DataEntry, DefinitionNestedArray, DefinitionNestedGenerationObject, DefinitionSubObject, VersionDefinitionObject } from '../types';
2
- import { EnumEntryDataType, OptionalEntryDataType, NestedContentType, NestedContentDataType, SingleLevelContentType, VersionArrayDefinitionType } from '../types/arrayDefinitions';
3
- export declare const isSingleLevelContentType: (data: NestedContentType) => boolean;
4
- export declare const isDoubleLevelContentType: (data: NestedContentType) => boolean;
5
- export declare const singleLevelContentTypeIsDataEntry: (data: SingleLevelContentType) => boolean;
6
- export declare const singleLevelContentTypeIsNestedContentDataType: (data: SingleLevelContentType) => boolean;
7
- export declare const singleLevelContentTypeIsEnumEntryDataType: (data: NestedContentType) => boolean;
8
- export declare const singleLevelContentTypeIsOptionalEntryDataType: (data: NestedContentType) => boolean;
9
- export declare const parseSingleLevelContentTypeToDefinitionSubObject: (data: SingleLevelContentType, internalPrecedingName?: string) => DefinitionSubObject;
10
- export declare const parseNestedContentDataTypeToDefinitionNestedArray: (data: NestedContentDataType, internalPrecedingName?: string) => DefinitionNestedArray | DefinitionNestedGenerationObject;
11
- export declare const parseEnumEntryDataTypeToDefinitionNestedGenerationObject: (data: EnumEntryDataType, name: string, internalPrecedingName?: string) => DefinitionNestedGenerationObject;
12
- export declare const parseOptionalEntryDataTypeToDefinitionNestedGenerationObject: (data: OptionalEntryDataType, name: string, internalPrecedingName?: string) => DefinitionNestedGenerationObject;
13
- export declare const parseDataEntry: (d: DataEntry, internalPrecedingName?: string) => DataEntry;
14
- export declare const parseVersionArrayDefinitionTypeToVersionDefinitionObject: (v: VersionArrayDefinitionType, optionalIndexOverwrite?: number) => VersionDefinitionObject;
@@ -1,36 +0,0 @@
1
- import { DataEntry } from '../types/dataEntry';
2
- import { SemanticlyNestedDataEntry } from '../types/semanticlyNestedDataEntry';
3
- import { DefinitionArrayObject, ParsersForVersionObject } from '../types/versionParser';
4
- /**
5
- * Method for finding the names of the variable data entries in the DefinitionArrayObject
6
- * @param definitionArrayObject - DefinitionArrayObject
7
- * @returns string[] - the key strings
8
- */
9
- export declare const getVariableStrings: (definitionArrayObject: DefinitionArrayObject) => string[];
10
- /**
11
- * Method that translates a DefinitionArrayObject into a SemanticlyNestedDataEntry
12
- * @param definitionArrayObject [DataEntry | [string, DefinitionArrayObject]]
13
- * @returns
14
- */
15
- export declare const nestedDataEntryArrayToObject: (definitionArrayObject: DefinitionArrayObject) => SemanticlyNestedDataEntry;
16
- /**
17
- * Method to parse a url into a SemanticlyNestedDataEntry.
18
- * @param url - the url to parse
19
- * @param parserVersions - the object containing the version parsers
20
- * @returns the parsed SemanticlyNestedDataEntry
21
- */
22
- export declare const parseUrlMethod: (url: string, parserVersions: ParsersForVersionObject) => SemanticlyNestedDataEntry;
23
- export declare const parseDownNestedDataDescription: (nestedDataDescription: SemanticlyNestedDataEntry) => DataEntry[];
24
- /**
25
- * Method to get an URL descriptor from a SemanticlyNestedDataEntry
26
- * @param data: SemanticlyNestedDataEntry
27
- * @returns base64 string
28
- */
29
- export declare const getURLForData: (data: SemanticlyNestedDataEntry) => string;
30
- export declare const getTestStringValues: (data: SemanticlyNestedDataEntry) => {
31
- bitsString: string;
32
- base64BitString: string;
33
- base64SplitString: string;
34
- base64String: string;
35
- raw: string;
36
- };
@@ -1,26 +0,0 @@
1
- import { DataEntry, DataEntryArray } from '../types/dataEntry';
2
- import { SemanticlyNestedDataEntry } from '../types/semanticlyNestedDataEntry';
3
- import { DefinitionArrayObject, ParserForVersion, ParsersForVersionObject } from '../types/versionParser';
4
- /**
5
- * Method to parse a definitionArrayObject according to a given dataArray
6
- * @param definitionArrayObject
7
- * @param dataArray
8
- * @returns - new SemanticlyNestedDataEntry
9
- */
10
- export declare const updateDataEntryObject: (definitionArrayObject: DefinitionArrayObject, dataArray: DataEntryArray) => SemanticlyNestedDataEntry;
11
- /**
12
- * Get the default object for a given version
13
- * @param versionParser - The parsers for all versions
14
- * @param versionindex - The index of the version for which to get the default object
15
- * @returns - The default object for the given version
16
- * @throws - Error if no parser for the given version index
17
- */
18
- export declare const getDefaultObject: (versionParser: ParsersForVersionObject, versionindex: number) => SemanticlyNestedDataEntry;
19
- /**
20
- * Method that handles the updating of a single value in a SemanticlyNestedDataEntry object
21
- * @param data SemanticlyNestedDataEntry
22
- * @param newDataEntry updated DataEntry
23
- * @param parsersForVersion version object
24
- * @returns a newly created object in case of a key data description, otherwise the same object with just the new Data Entry value updated
25
- */
26
- export declare const updateDataEntry: (data: SemanticlyNestedDataEntry, newDataEntry: DataEntry, parsersForVersion: ParserForVersion[]) => SemanticlyNestedDataEntry;
@@ -1,56 +0,0 @@
1
- import { VersionArrayDefinitionType, VersionRangeType, VersionEnumSemantics, ParsersForVersionObject, SemanticlyNestedDataEntry, DataEntry, SemanticlyNestedValues, DataEntryArray } from '../types';
2
- /**
3
- * Method to create version definition objects
4
- * @param {VersionArrayDefinitionType[]} versionArray - version definition array
5
- * @param {VersionRangeType} versionBitCount - bit count
6
- * @param {VersionEnumSemantics[] | VersionEnumSemantics} enumSemanticsMapping - optional semantics mapping for enums. If not given, values will be numbers
7
- * @param {undefined | Record<string, string> | Record<string, string>[]} attributeSemanticsMapping - optional semantics mapping, if nothing given no semantics will be mapped
8
- * @returns ParsersForVersionObject
9
- */
10
- export declare const createParserObject: (versionArray: VersionArrayDefinitionType[], versionBitCount: VersionRangeType, enumSemanticsMapping?: VersionEnumSemantics[] | VersionEnumSemantics, attributeSemanticsMapping?: Record<string, string>[] | Record<string, string>) => ParsersForVersionObject;
11
- /** the data object needs to be accesible in 3 versions.
12
- *
13
- * 1. As a semanticly nested object (primary data structure, also used for UI)
14
- * 2. As an array of entries (derived from semanticly nested object, to translate and from to bitstream)
15
- * 3. As an object with all the data entry information stripped (derived from semanticly nested object, read only)
16
- */
17
- /**
18
- * Construct SemanticlyNestedDataEntry
19
- * @param urlSafeBase64 - the url to parse
20
- * @param parserVersions - the object containing the version parsers
21
- * @returns the parsed SemanticlyNestedDataEntry
22
- */
23
- export declare const parseUrl: (urlSafeBase64: string, parserVersions: ParsersForVersionObject) => SemanticlyNestedDataEntry;
24
- /**
25
- * Update a data entry in a SemanticlyNestedDataEntry
26
- * @param {DataEntry} updatedEntry - the updated data entry
27
- * @param {SemanticlyNestedDataEntry} currentObject - the current Data Object
28
- * @param {ParsersForVersionObject} parserVersions - the object containing the version parsers
29
- * @returns {SemanticlyNestedDataEntry} - the updated SemanticlyNestedDataEntry
30
- */
31
- export declare const updateDataEntry: (updatedEntry: DataEntry, currentObject: SemanticlyNestedDataEntry, parserVersions: ParsersForVersionObject) => SemanticlyNestedDataEntry;
32
- /**
33
- * Method to get the URLSafeBase64 representation of a SemanticlyNestedDataEntry
34
- * @param {SemanticlyNestedDataEntry} data - the data object
35
- * @returns {string} - the urlSafeBase64 representation
36
- */
37
- export declare const getURLSafeBase64ForData: (data: SemanticlyNestedDataEntry) => string;
38
- /**
39
- * Method for getting the basic object for a given semanticly nested data entry
40
- * @param {SemanticlyNestedDataEntry} data - the data object
41
- * @returns {SemanticlyNestedDataEntry} - the basic object
42
- */
43
- export declare const getSemanticallyNestedValues: (data: SemanticlyNestedDataEntry, parserVersions: ParsersForVersionObject) => SemanticlyNestedValues;
44
- /**
45
- * Method to get the default object for a given version
46
- * @param {ParsersForVersionObject} parserForVersions - the object containing the version parsers
47
- * @param {number} versionindex - number of the version you want to generate the default object for
48
- * @returns SemanticlyNestedDataEntry
49
- */
50
- export declare const getDefaultObject: (parserForVersions: ParsersForVersionObject, versionindex: number) => SemanticlyNestedDataEntry;
51
- /**
52
- * Method to get the get a (sorted by index) flat array of a SemanticallyNestedDataEntry
53
- * @param {SemanticlyNestedDataEntry} data - the semanticly nested data entry to flatten
54
- * @returns DataEntryArray
55
- */
56
- export declare const getFlatArray: (data: SemanticlyNestedDataEntry) => DataEntryArray;
@@ -1,14 +0,0 @@
1
- import { ParsersForVersionObject } from '../types';
2
- import { NestedContentDataType, OptionalEntryDataType, EnumEntryDataType, VersionArrayDefinitionType, NestedContentType } from '../types/arrayDefinitions';
3
- export declare const nestedContentDataType: NestedContentDataType;
4
- export declare const validOptionalEntryType: OptionalEntryDataType;
5
- export declare const anotherValidOptionalEntryType: OptionalEntryDataType;
6
- export declare const validEnumEntryType: EnumEntryDataType;
7
- export declare const generalNestedContentDataType: NestedContentDataType;
8
- export declare const exampleVersion: VersionArrayDefinitionType;
9
- export declare const lucernaeTuricumArcExamples: EnumEntryDataType;
10
- export declare const footprintDefinition: EnumEntryDataType;
11
- export declare const heightParsingDefinition: NestedContentType;
12
- export declare const shapePreProcessingDefinition: EnumEntryDataType;
13
- export declare const lucernaeTurici: VersionArrayDefinitionType;
14
- export declare const lucernaeTuriciVersions: ParsersForVersionObject;
@@ -1 +0,0 @@
1
- export declare const values: [boolean, string][];
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export declare const values: [number, number, string][];
@@ -1,2 +0,0 @@
1
- import { PrecisionRangeType } from '../types';
2
- export declare const values: [number, number, number, PrecisionRangeType, string][];
@@ -1 +0,0 @@
1
- export declare const values: [number, number, number, string][];
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- import { VersionRangeType } from '../types';
2
- export declare const values: [number, VersionRangeType, string][];
@@ -1,7 +0,0 @@
1
- import { DataEntry } from './dataEntry';
2
- export type SemanticlyNestedDataEntry = {
3
- [key: string]: SemanticlyNestedDataEntry | DataEntry;
4
- };
5
- export type SemanticlyNestedValues = {
6
- [key: string]: SemanticlyNestedValues | boolean | number | string;
7
- };
@@ -1,32 +0,0 @@
1
- import { ObjectGenerationOutputStatus } from '../enums/objectGenerationTypes';
2
- import { DataEntry, VersionDataEntry } from './dataEntry';
3
- import { SemanticlyNestedDataEntry } from './semanticlyNestedDataEntry';
4
- import { VersionRangeType } from './versionData';
5
- /**
6
- * A method that generates a nested object based on a set of values
7
- * @param s - url bit string (optional)
8
- * @param v - The values to be used to generate the object, can be either a valid value for a dataentry, a bitstring (only 0 or 1 chars) or undefined (default value)
9
- * @returns [The generated object, the generation status, the index end bit of the bit url (-1 if)]
10
- */
11
- export type ObjectGeneratorMethod = (s?: string, ...v: (DataEntry | undefined)[]) => [SemanticlyNestedDataEntry, ObjectGenerationOutputStatus, number];
12
- export type DefinitionGenerationObject = (v: DataEntry) => DefinitionArrayObject;
13
- export type DefinitionNestedArray = [string, DefinitionArrayObject];
14
- export type DefinitionNestedGenerationObject = [string, DataEntry, DefinitionGenerationObject];
15
- export type DefinitionSubObject = DataEntry | DefinitionNestedArray | DefinitionNestedGenerationObject;
16
- export type DefinitionArrayObject = DefinitionSubObject[];
17
- export type VersionDefinitionObject = [VersionDataEntry, ...DefinitionArrayObject];
18
- export type VersionEnumSemantics = {
19
- [key: string]: {
20
- value: number;
21
- label: string;
22
- }[];
23
- };
24
- export type ParserForVersion = {
25
- enumSemanticsMapping?: VersionEnumSemantics;
26
- attributeSemanticsMapping?: Record<string, string>;
27
- objectGeneratorParameters: VersionDefinitionObject;
28
- };
29
- export type ParsersForVersionObject = {
30
- versionBitCount: VersionRangeType;
31
- parsers: ParserForVersion[];
32
- };