url-safe-bitpacking 0.1.14 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +9 -0
  2. package/dist/enums/dataTypes.d.ts +4 -8
  3. package/dist/factory/arrayFactory.d.ts +2 -0
  4. package/dist/factory/enumArrayFactory.d.ts +2 -0
  5. package/dist/factory/enumFactory.d.ts +1 -1
  6. package/dist/factory/enumOptionsFactory.d.ts +2 -0
  7. package/dist/factory/factory.d.ts +13 -0
  8. package/dist/factory/floatFactory.d.ts +9 -0
  9. package/dist/factory/helperMethod.d.ts +19 -0
  10. package/dist/factory/optionalFactory.d.ts +2 -0
  11. package/dist/factory/utils.d.ts +9 -0
  12. package/dist/index.d.ts +5 -5
  13. package/dist/index.js +536 -306
  14. package/dist/parsers/arrayParser.d.ts +4 -0
  15. package/dist/parsers/enumArrayParser.d.ts +4 -0
  16. package/dist/parsers/enumOptionsFactory.d.ts +4 -0
  17. package/dist/parsers/intParser.d.ts +6 -0
  18. package/dist/parsers/optionalParser.d.ts +4 -0
  19. package/dist/parsers/parsers.d.ts +81 -13
  20. package/dist/stateHandling/index.d.ts +1 -0
  21. package/dist/stateHandling/stateData.d.ts +3 -0
  22. package/dist/stateHandling/stateDataObject.d.ts +15 -0
  23. package/dist/typeFactory/dataEntryTyping.d.ts +6 -0
  24. package/dist/typeFactory/index.d.ts +1 -0
  25. package/dist/typeFactory/stateDataTyping.d.ts +1 -0
  26. package/dist/types/arrayData.d.ts +10 -0
  27. package/dist/types/booleanData.d.ts +1 -2
  28. package/dist/types/dataEntry.d.ts +64 -6
  29. package/dist/types/enumArrayData.d.ts +20 -0
  30. package/dist/types/enumData.d.ts +8 -2
  31. package/dist/types/enumOptionsData.d.ts +8 -0
  32. package/dist/types/floatData.d.ts +10 -2
  33. package/dist/types/index.d.ts +7 -5
  34. package/dist/types/intData.d.ts +8 -2
  35. package/dist/types/optionalData.d.ts +7 -0
  36. package/dist/types/stateDataEntry.d.ts +16 -0
  37. package/dist/types/versionData.d.ts +1 -2
  38. package/dist/update/arrayUpdate.d.ts +2 -0
  39. package/dist/update/enumArrayUpdate.d.ts +2 -0
  40. package/dist/update/enumOptionsUpdate.d.ts +2 -0
  41. package/dist/update/nestedDataMatching.d.ts +2 -0
  42. package/dist/update/optionalUpdate.d.ts +2 -0
  43. package/dist/update/updateValues.d.ts +14 -1
  44. package/package.json +3 -2
  45. package/dist/objectmap/index.d.ts +0 -4
  46. package/dist/objectmap/stateDataModel.d.ts +0 -19
  47. package/dist/objectmap/stateValueHelperMethods.d.ts +0 -13
  48. package/dist/objectmap/userMethods.d.ts +0 -12
  49. package/dist/types/arrayDefinitions.d.ts +0 -10
  50. package/dist/types/semanticMapping.d.ts +0 -6
  51. package/dist/types/stateValueModel.d.ts +0 -33
package/dist/index.js CHANGED
@@ -1,31 +1,31 @@
1
1
  // src/enums/dataTypes.ts
2
- var DataType;
3
- (function(DataType2) {
4
- DataType2[DataType2["VERSION"] = 0] = "VERSION";
5
- DataType2[DataType2["BOOLEAN"] = 1] = "BOOLEAN";
6
- DataType2[DataType2["ENUM"] = 2] = "ENUM";
7
- DataType2[DataType2["INT"] = 3] = "INT";
8
- DataType2[DataType2["FLOAT"] = 4] = "FLOAT";
9
- })(DataType || (DataType = {}));
10
- // src/enums/objectGenerationTypes.ts
11
- var ObjectGenerationOutputStatus;
12
- (function(ObjectGenerationOutputStatus2) {
13
- ObjectGenerationOutputStatus2[ObjectGenerationOutputStatus2["DEFAULT"] = 0] = "DEFAULT";
14
- ObjectGenerationOutputStatus2[ObjectGenerationOutputStatus2["FROM_TYPE"] = 1] = "FROM_TYPE";
15
- ObjectGenerationOutputStatus2[ObjectGenerationOutputStatus2["PARSED"] = 2] = "PARSED";
16
- ObjectGenerationOutputStatus2[ObjectGenerationOutputStatus2["ERROR_PARSING"] = 3] = "ERROR_PARSING";
17
- })(ObjectGenerationOutputStatus || (ObjectGenerationOutputStatus = {}));
2
+ var DataTypeValues = ["VERSION", "BOOLEAN", "ENUM", "INT", "FLOAT", "ENUM_ARRAY"];
3
+ var ComplexDataValues = ["OPTIONAL", "ENUM_OPTIONS", "ARRAY"];
18
4
  // src/types/floatData.ts
19
5
  var SignificandMaxBits = 20;
20
-
21
- // src/types/arrayDefinitions.ts
22
- var PREFIX_SEPERATOR_DELIMETER = "_";
23
6
  // src/types/enumData.ts
24
7
  var EnumMaxBits = 8;
25
8
  // src/types/intData.ts
26
9
  var IntegerMaxBits = 12;
27
- // src/types/versionData.ts
28
- var VersionRange = [4, 6, 8, 10];
10
+ // src/types/dataEntry.ts
11
+ var PROTECTED_ATTRIBUTE_NAMES = [
12
+ "type",
13
+ "value",
14
+ "name",
15
+ "internalName",
16
+ "index",
17
+ "min",
18
+ "max",
19
+ "bits",
20
+ "precision",
21
+ "significand",
22
+ "minCount",
23
+ "maxCount",
24
+ "state",
25
+ "stateBits",
26
+ "descriptor",
27
+ "mapping"
28
+ ];
29
29
  // src/factory/helperMethod.ts
30
30
  var getBitsForIntegerNumber = (number, maxBits) => {
31
31
  const bitCount = Math.ceil(Math.log2(number));
@@ -33,14 +33,7 @@ var getBitsForIntegerNumber = (number, maxBits) => {
33
33
  throw new Error(`Cannot get ${maxBits} bits for a number with ${bitCount} bits`);
34
34
  return bitCount;
35
35
  };
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
- };
36
+ var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v + 1));
44
37
 
45
38
  // src/factory/floatFactory.ts
46
39
  var create = (value, min = 0, max = 1, precision = 2, name = "", index = -1) => {
@@ -51,7 +44,7 @@ var create = (value, min = 0, max = 1, precision = 2, name = "", index = -1) =>
51
44
  const significand = Math.max(1, getBitsForIntegerNumber(delta, SignificandMaxBits));
52
45
  return {
53
46
  value,
54
- type: DataType.FLOAT,
47
+ type: "FLOAT",
55
48
  min: roundedMin / precisionMultiplier,
56
49
  max: roundedMax / precisionMultiplier,
57
50
  precision,
@@ -70,31 +63,149 @@ var create2 = (value, min = 0, max = 10, name = "", index = -1) => {
70
63
  if (Math.abs(max - min) > 2 ** IntegerMaxBits - 1)
71
64
  throw new Error("max - min must be less than 1024");
72
65
  const bits = getBitsForIntegerNumber(max - min + 1, IntegerMaxBits);
73
- return { value, type: DataType.INT, min, max, bits, name, index };
66
+ return { value, type: "INT", min, max, bits, name, index };
74
67
  };
75
68
 
76
69
  // src/factory/booleanFactory.ts
77
- var create3 = (value, name = "", index = -1) => ({ value, type: DataType.BOOLEAN, name, index });
70
+ var create3 = (value, name = "", index = -1) => ({
71
+ value,
72
+ type: "BOOLEAN",
73
+ name,
74
+ index
75
+ });
78
76
 
79
77
  // src/factory/versionFactory.ts
80
78
  var create4 = (value, bits = 8, name = "", index = -1) => ({
81
79
  value,
82
- type: DataType.VERSION,
80
+ type: "VERSION",
83
81
  bits,
84
82
  name,
85
83
  index
86
84
  });
87
85
 
86
+ // src/factory/utils.ts
87
+ var getOptionsFromEnumOptions = (options) => {
88
+ if (typeof options === "string")
89
+ return { max: options.length - 1, mapping: options.split(",").map(Number) };
90
+ if (typeof options === "number")
91
+ return { max: options, mapping: Array.from({ length: options + 1 }, (_, i) => i) };
92
+ return { max: options.length - 1, mapping: options };
93
+ };
94
+
88
95
  // src/factory/enumFactory.ts
89
- var create5 = (value, max = 10, name = "", index = -1) => {
96
+ var create5 = (value, options, name = "", index = -1) => {
97
+ const { max, mapping } = getOptionsFromEnumOptions(options);
90
98
  if (!Number.isInteger(max))
91
- throw new Error("min and max must be integers");
99
+ throw new Error(`max must be integers, you have given ${max}`);
92
100
  if (max < 1)
93
101
  throw new Error("max must be at least one");
94
102
  if (max > 2 ** EnumMaxBits - 1)
95
103
  throw new Error("max - min must be less than 256");
96
104
  const bits = getBitsForIntegerNumber(max + 1, EnumMaxBits);
97
- return { value, type: DataType.ENUM, max, bits, name, index };
105
+ return { value, type: "ENUM", max, bits, name, index, mapping };
106
+ };
107
+
108
+ // src/factory/enumArrayFactory.ts
109
+ var create6 = (value, options, minCount = 1, maxCount = 10, name = "", index = -1) => {
110
+ const { max, mapping } = getOptionsFromEnumOptions(options);
111
+ if (!Number.isInteger(max))
112
+ throw new Error(`max must be integers, you have given ${max}`);
113
+ if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
114
+ throw new Error("minCount and maxCount must be integers");
115
+ if (max < 1)
116
+ throw new Error("must have at least two options");
117
+ if (max > 2 ** IntegerMaxBits - 1)
118
+ throw new Error(`maximum allowed options is 1024, you have given ${max + 1} options`);
119
+ minCount = Math.min(minCount, maxCount);
120
+ maxCount = Math.max(minCount, maxCount);
121
+ if (minCount < 1)
122
+ throw new Error("minCount must be at least one");
123
+ if (maxCount - minCount < 0)
124
+ throw new Error(`count range length must be positive, given count range length is ${Math.abs(maxCount - minCount)}`);
125
+ if (Math.abs(maxCount - minCount) > 2 ** IntegerMaxBits - 1)
126
+ throw new Error(`count range length must be less than 1024, given count range length is ${Math.abs(maxCount - minCount)}`);
127
+ value.forEach((v, i) => {
128
+ if (!Number.isInteger(v))
129
+ throw new Error(`all entries must be integers, index ${i} (${v}) is not`);
130
+ if (v > max)
131
+ throw new Error(`all entries must be within the range ${0} - ${max}, index ${i} (${v}) is not`);
132
+ });
133
+ if (value.length < minCount || value.length > maxCount)
134
+ throw new Error(`value length must be between minCount and maxCount, ${value.length} is not between ${minCount} and ${maxCount}`);
135
+ return {
136
+ type: "ENUM_ARRAY",
137
+ minCount,
138
+ maxCount,
139
+ value: JSON.parse(JSON.stringify(value)),
140
+ max,
141
+ name,
142
+ index,
143
+ mapping
144
+ };
145
+ };
146
+
147
+ // src/factory/optionalFactory.ts
148
+ var create7 = (descriptor, defaultState = false, name = "", index = -1) => {
149
+ if (descriptor[0] === null && descriptor[1] === null)
150
+ throw new Error("descriptor must have at least one non-null value");
151
+ if (descriptor[0] !== null && descriptor[1] !== null)
152
+ throw new Error("descriptor must have only one non-null value");
153
+ return {
154
+ type: "OPTIONAL",
155
+ state: defaultState,
156
+ descriptor,
157
+ value: JSON.parse(JSON.stringify(defaultState ? descriptor[1] : descriptor[0])),
158
+ name,
159
+ index
160
+ };
161
+ };
162
+
163
+ // src/factory/enumOptionsFactory.ts
164
+ var maxEnumOptions = 64;
165
+ var maxEnumOptionsBits = getMinimumBitsForInteger(maxEnumOptions);
166
+ var create8 = (descriptor, defaultState = 0, name = "", index = -1) => {
167
+ if (descriptor.length < 2)
168
+ throw new Error("descriptor must have at least two entries");
169
+ if (descriptor.length - 1 < defaultState)
170
+ throw new Error("defaultState must be less than the length of the descriptor");
171
+ return {
172
+ value: JSON.parse(JSON.stringify(descriptor[defaultState])),
173
+ descriptor,
174
+ name,
175
+ index,
176
+ type: "ENUM_OPTIONS",
177
+ stateBits: getBitsForIntegerNumber(descriptor.length, maxEnumOptionsBits),
178
+ state: defaultState
179
+ };
180
+ };
181
+
182
+ // src/factory/arrayFactory.ts
183
+ var maxArrayCount = 64;
184
+ var create9 = (descriptor, defaultState = 0, minCount = 0, maxCount = 10, name = "", index = -1) => {
185
+ if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
186
+ throw new Error("minCount and maxCount must be integers");
187
+ if (minCount < 0)
188
+ throw new Error("minCount must be at least 0");
189
+ if (maxCount < 0)
190
+ throw new Error("maxCount must be at least 0");
191
+ if (maxCount - minCount < 0)
192
+ throw new Error("maxCount must be greater than or equal to minCount");
193
+ if (maxCount - minCount > maxArrayCount)
194
+ throw new Error(`maxCount (${maxCount}) - minCount (${minCount}) = ${maxCount - minCount} must be less than or equal to maxArrayCount (${maxArrayCount})`);
195
+ if (defaultState < minCount || defaultState > maxCount)
196
+ throw new Error(`defaultState must be between minCount (${minCount}) and maxCount (${maxCount}), given defaultState is ${defaultState}`);
197
+ const stateBits = getMinimumBitsForInteger(maxCount - minCount);
198
+ return {
199
+ value: [...Array(defaultState)].map(() => JSON.parse(JSON.stringify(descriptor))),
200
+ descriptor,
201
+ type: "ARRAY",
202
+ minCount,
203
+ maxCount,
204
+ stateBits,
205
+ state: defaultState,
206
+ name,
207
+ index
208
+ };
98
209
  };
99
210
 
100
211
  // src/factory/factory.ts
@@ -103,10 +214,16 @@ var DataEntryFactory = {
103
214
  createInt: create2,
104
215
  createEnum: create5,
105
216
  createBoolean: create3,
106
- createVersion: create4
217
+ createVersion: create4,
218
+ createEnumArray: create6
219
+ };
220
+ var ComplexDataEntryFactory = {
221
+ createOptional: create7,
222
+ createEnumOptions: create8,
223
+ createArray: create9
107
224
  };
108
225
  // src/parsers/intParser.ts
109
- var getBitsCount = (intData3) => intData3.bits;
226
+ var getBitsCount = (intData2) => intData2.bits;
110
227
  var rawValueParser = (stateString, bitCount) => {
111
228
  if (stateString.length < bitCount)
112
229
  throw new Error(`To few bits for this int bit string (${stateString.length} instead of ${bitCount})`);
@@ -117,9 +234,9 @@ var rawValueParser = (stateString, bitCount) => {
117
234
  throw new Error("Invalid int state string");
118
235
  return parsed;
119
236
  };
120
- var rawParser = (stateString, intData3) => {
121
- const v = rawValueParser(stateString, intData3.bits) + intData3.min;
122
- if (v > intData3.max)
237
+ var rawParser = (stateString, intData2) => {
238
+ const v = rawValueParser(stateString, intData2.bits) + intData2.min;
239
+ if (v > intData2.max)
123
240
  throw new Error("Value exceeds max");
124
241
  return v;
125
242
  };
@@ -128,16 +245,16 @@ var rawIntStringifier = (value, bitCount) => {
128
245
  throw new Error("Value is not an integer");
129
246
  return value.toString(2).padStart(bitCount, "0");
130
247
  };
131
- var rawStringifier = (value, intData3) => {
132
- if (value < intData3.min)
248
+ var rawStringifier = (value, intData2) => {
249
+ if (value < intData2.min)
133
250
  throw new Error("Value is below min");
134
- if (value > intData3.max)
251
+ if (value > intData2.max)
135
252
  throw new Error("Value exceeds max");
136
- return rawIntStringifier(value - intData3.min, intData3.bits);
253
+ return rawIntStringifier(value - intData2.min, intData2.bits);
137
254
  };
138
255
 
139
256
  // src/parsers/floatParser.ts
140
- var getBitsCount2 = (floatData3) => floatData3.significand;
257
+ var getBitsCount2 = (floatData2) => floatData2.significand;
141
258
  var rawValueParser2 = (stateString, significandBits, precision) => {
142
259
  if (stateString.length < significandBits)
143
260
  throw new Error(`To few bits for this float bit string (${stateString.length} instead of ${significandBits})`);
@@ -146,13 +263,13 @@ var rawValueParser2 = (stateString, significandBits, precision) => {
146
263
  const significand = rawValueParser(stateString, significandBits);
147
264
  return significand * 10 ** -precision;
148
265
  };
149
- var rawParser2 = (stateString, floatData3) => {
150
- const v = floatData3.min + rawValueParser2(stateString, floatData3.significand, floatData3.precision);
151
- if (v > floatData3.max)
266
+ var rawParser2 = (stateString, floatData2) => {
267
+ const v = floatData2.min + rawValueParser2(stateString, floatData2.significand, floatData2.precision);
268
+ if (v > floatData2.max)
152
269
  throw new Error("Float value exceeds max");
153
270
  return v;
154
271
  };
155
- var rawStringifier2 = (value, floatData3) => rawIntStringifier(Math.round((value - floatData3.min) * 10 ** floatData3.precision), floatData3.significand);
272
+ var rawStringifier2 = (value, floatData2) => rawIntStringifier(Math.round((value - floatData2.min) * 10 ** floatData2.precision), floatData2.significand);
156
273
 
157
274
  // src/parsers/enumParser.ts
158
275
  var getBitsCount3 = (versionData2) => versionData2.bits;
@@ -184,66 +301,202 @@ var rawValueParser3 = (stateString) => {
184
301
  var rawParser5 = (stateString) => rawValueParser3(stateString);
185
302
  var rawStringifier5 = (value) => value ? "1" : "0";
186
303
 
304
+ // src/parsers/enumArrayParser.ts
305
+ var getCountBitsCount = (enumArrayData2) => getBitsForIntegerNumber(enumArrayData2.maxCount - enumArrayData2.minCount + 1, IntegerMaxBits);
306
+ var getNumberBitsCountForBase = (count, base) => getBitsForEnumArrayCountOfBase(count, base);
307
+ var getEnumArrayBase = (enumArrayData2) => enumArrayData2.max + 1;
308
+ var getCount = (enumArrayData2, bitString) => {
309
+ const countBits = getCountBitsCount(enumArrayData2);
310
+ if (countBits === 0)
311
+ return enumArrayData2.minCount;
312
+ return rawValueParser(bitString.slice(0, countBits), countBits) + enumArrayData2.minCount;
313
+ };
314
+ var getBitsCount6 = (enumArrayData2, bitString) => {
315
+ const countBits = getCountBitsCount(enumArrayData2);
316
+ const count = getCount(enumArrayData2, bitString);
317
+ const valuesBitCount = getNumberBitsCountForBase(count, getEnumArrayBase(enumArrayData2));
318
+ return countBits + valuesBitCount;
319
+ };
320
+ var rawParser6 = (bitString, enumArrayData2) => {
321
+ const countBits = getCountBitsCount(enumArrayData2);
322
+ const count = getCount(enumArrayData2, bitString);
323
+ const base = getEnumArrayBase(enumArrayData2);
324
+ const valuesBitCount = getNumberBitsCountForBase(count, base);
325
+ return convertBitStringToArbitraryBase(bitString.slice(countBits, countBits + valuesBitCount), base, count);
326
+ };
327
+ var rawStringifier6 = (value, enumArrayData2) => {
328
+ const countBits = getCountBitsCount(enumArrayData2);
329
+ const count = value.length;
330
+ const base = getEnumArrayBase(enumArrayData2);
331
+ const countBitstring = countBits ? rawIntStringifier(count - enumArrayData2.minCount, countBits) : "";
332
+ const enumArrayBitstring = convertArbitraryBaseToBitString(value, base);
333
+ return countBitstring + enumArrayBitstring;
334
+ };
335
+
336
+ // src/parsers/arrayParser.ts
337
+ var getCount2 = (arrayData2, bitString) => {
338
+ if (arrayData2.stateBits === 0)
339
+ return arrayData2.minCount;
340
+ return rawValueParser(bitString.slice(0, arrayData2.stateBits), arrayData2.stateBits) + arrayData2.minCount;
341
+ };
342
+ var rawParser7 = (bitString, arrayData2) => {
343
+ const state = getCount2(arrayData2, bitString);
344
+ bitString = bitString.slice(arrayData2.stateBits);
345
+ const value = [];
346
+ for (let i = 0;i < state; i++) {
347
+ const [nestedData, remainingBitstring] = nestedDataBitstringParser(bitString, arrayData2.descriptor);
348
+ value.push(nestedData);
349
+ bitString = remainingBitstring;
350
+ }
351
+ return [{ ...arrayData2, value, state }, bitString];
352
+ };
353
+ var rawStateStringifier = (arrayData2) => arrayData2.stateBits ? rawIntStringifier(arrayData2.value.length - arrayData2.minCount, arrayData2.stateBits) : "";
354
+
355
+ // src/parsers/optionalParser.ts
356
+ var getState = (bitString) => Number(bitString.slice(0, 1));
357
+ var rawParser8 = (bitString, optionalData2) => {
358
+ const descriptorIndex = getState(bitString);
359
+ bitString = bitString.slice(1);
360
+ const [value, remainingBitstring] = optionalData2.descriptor[descriptorIndex] ? nestedDataBitstringParser(bitString, optionalData2.descriptor[descriptorIndex]) : [null, bitString];
361
+ const state = Boolean(descriptorIndex);
362
+ return [{ ...optionalData2, value, state }, remainingBitstring];
363
+ };
364
+ var rawStateStringifier2 = (optionalData2) => optionalData2.state ? "1" : "0";
365
+
366
+ // src/parsers/enumOptionsFactory.ts
367
+ var getStateIndex = (enumOptionsData2, bitString) => {
368
+ if (enumOptionsData2.stateBits === 0)
369
+ return 0;
370
+ return rawValueParser(bitString.slice(0, enumOptionsData2.stateBits), enumOptionsData2.stateBits);
371
+ };
372
+ var rawParser9 = (bitString, enumOptionsData2) => {
373
+ const state = getStateIndex(enumOptionsData2, bitString);
374
+ bitString = bitString.slice(enumOptionsData2.stateBits);
375
+ const [value, remainingBitstring] = nestedDataBitstringParser(bitString, enumOptionsData2.descriptor[state]);
376
+ return [{ ...enumOptionsData2, value, state }, remainingBitstring];
377
+ };
378
+ var rawStateStringifier3 = (enumOptionsData2) => rawIntStringifier(enumOptionsData2.state, enumOptionsData2.stateBits);
379
+
187
380
  // src/parsers/parsers.ts
188
381
  var valueBitsParser = (bitString, mapData) => {
189
382
  switch (mapData.type) {
190
- case DataType.BOOLEAN:
383
+ case "BOOLEAN":
191
384
  return rawParser5(bitString);
192
- case DataType.INT:
385
+ case "INT":
193
386
  return rawParser(bitString, mapData);
194
- case DataType.ENUM:
387
+ case "ENUM":
195
388
  return rawParser3(bitString, mapData);
196
- case DataType.FLOAT:
389
+ case "FLOAT":
197
390
  return rawParser2(bitString, mapData);
198
- case DataType.VERSION:
391
+ case "VERSION":
199
392
  return rawParser4(bitString, mapData);
393
+ case "ENUM_ARRAY":
394
+ return rawParser6(bitString, mapData);
200
395
  }
201
396
  };
202
397
  var dataBitsParser = (rawString, mapData) => {
203
398
  switch (mapData.type) {
204
- case DataType.BOOLEAN:
399
+ case "BOOLEAN":
400
+ return { ...mapData, value: valueBitsParser(rawString, mapData) };
401
+ case "ENUM":
402
+ case "INT":
403
+ case "FLOAT":
404
+ case "VERSION":
205
405
  return { ...mapData, value: valueBitsParser(rawString, mapData) };
206
- case DataType.ENUM:
207
- case DataType.INT:
208
- case DataType.FLOAT:
209
- case DataType.VERSION:
406
+ case "ENUM_ARRAY":
210
407
  return { ...mapData, value: valueBitsParser(rawString, mapData) };
211
408
  }
212
409
  };
213
- var getBitsCount6 = (mapData) => {
410
+ var getBitsCount7 = (mapData, bitString) => {
214
411
  switch (mapData.type) {
215
- case DataType.BOOLEAN:
412
+ case "BOOLEAN":
216
413
  return getBitsCount5();
217
- case DataType.INT:
414
+ case "INT":
218
415
  return getBitsCount(mapData);
219
- case DataType.FLOAT:
416
+ case "FLOAT":
220
417
  return getBitsCount2(mapData);
221
- case DataType.VERSION:
418
+ case "VERSION":
222
419
  return getBitsCount4(mapData);
223
- case DataType.ENUM:
420
+ case "ENUM":
224
421
  return getBitsCount3(mapData);
422
+ case "ENUM_ARRAY":
423
+ return getBitsCount6(mapData, bitString);
225
424
  }
226
425
  };
227
426
  var dataEntryBitstringParser = (bitstring, dataEntry2) => [
228
- dataBitsParser(bitstring.slice(0, getBitsCount6(dataEntry2)), dataEntry2),
229
- bitstring.slice(getBitsCount6(dataEntry2))
427
+ dataBitsParser(bitstring.slice(0, getBitsCount7(dataEntry2, bitstring)), dataEntry2),
428
+ bitstring.slice(getBitsCount7(dataEntry2, bitstring))
230
429
  ];
430
+ var nestedDataBitstringParser = (bitstring, descriptor) => {
431
+ const resultingNestedData = descriptor.map((data) => {
432
+ const [resultingData, remainingBitstring] = ComplexDataValues.includes(data.type) ? complexDataEntryBitstringParser(bitstring, data) : dataEntryBitstringParser(bitstring, data);
433
+ bitstring = remainingBitstring;
434
+ return resultingData;
435
+ });
436
+ return [resultingNestedData, bitstring];
437
+ };
438
+ var complexDataEntryBitstringParser = (bitstring, complexDataEntry) => {
439
+ switch (complexDataEntry.type) {
440
+ case "ARRAY":
441
+ return rawParser7(bitstring, complexDataEntry);
442
+ case "OPTIONAL":
443
+ return rawParser8(bitstring, complexDataEntry);
444
+ case "ENUM_OPTIONS":
445
+ return rawParser9(bitstring, complexDataEntry);
446
+ }
447
+ };
231
448
  var dataBitsStringifier = (data) => {
232
449
  switch (data.type) {
233
- case DataType.BOOLEAN:
450
+ case "BOOLEAN":
234
451
  return rawStringifier5(data.value);
235
- case DataType.INT:
452
+ case "INT":
236
453
  return rawStringifier(data.value, data);
237
- case DataType.FLOAT:
454
+ case "FLOAT":
238
455
  return rawStringifier2(data.value, data);
239
- case DataType.VERSION:
456
+ case "VERSION":
240
457
  return rawStringifier4(data.value, data);
241
- case DataType.ENUM:
458
+ case "ENUM":
242
459
  return rawStringifier3(data.value, data);
460
+ case "ENUM_ARRAY":
461
+ return rawStringifier6(data.value, data);
462
+ }
463
+ };
464
+ var complexDataStateStringifier = (complexDataEntry) => {
465
+ switch (complexDataEntry.type) {
466
+ case "ARRAY":
467
+ return rawStateStringifier(complexDataEntry);
468
+ case "OPTIONAL":
469
+ return rawStateStringifier2(complexDataEntry);
470
+ case "ENUM_OPTIONS":
471
+ return rawStateStringifier3(complexDataEntry);
243
472
  }
244
473
  };
245
474
  var dataEntryCorrecting = (dataEntry2) => dataBitsParser(dataBitsStringifier(dataEntry2), dataEntry2);
246
475
  var base64url = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
476
+ var getBitsForEnumArrayCountOfBase = (count, base) => Math.ceil(Math.log2(base) * count);
477
+ var convertArbitraryBaseToBitString = (input, fromBase) => {
478
+ const expectedOutputLength = getBitsForEnumArrayCountOfBase(input.length, fromBase);
479
+ const fromBaseBigInt = BigInt(fromBase);
480
+ let decimalValue = BigInt(0);
481
+ for (let i = input.length - 1;i >= 0; i--)
482
+ decimalValue = decimalValue * fromBaseBigInt + BigInt(input[i]);
483
+ const s = decimalValue.toString(2).padStart(expectedOutputLength, "0");
484
+ return s;
485
+ };
486
+ var convertBitStringToArbitraryBase = (input, toBase, expectedOutputLength) => {
487
+ let decimalValue = BigInt(`0b${input}`);
488
+ const toBaseBigInt = BigInt(toBase);
489
+ const result = [];
490
+ while (decimalValue > 0) {
491
+ const remainder = decimalValue % toBaseBigInt;
492
+ result.push(Number(remainder));
493
+ decimalValue = decimalValue / toBaseBigInt;
494
+ }
495
+ if (expectedOutputLength !== undefined && result.length !== expectedOutputLength)
496
+ for (let i = result.length;i < expectedOutputLength; i++)
497
+ result.push(0);
498
+ return result;
499
+ };
247
500
  var parseBitsToBase64 = (bits) => {
248
501
  const chunks = bits.match(/.{1,6}/g);
249
502
  const numbers = chunks?.map((c) => Number.parseInt(c.padEnd(6, "0"), 2)) ?? [];
@@ -254,34 +507,22 @@ var parseBase64ToBits = (base64) => {
254
507
  const chunks = numbers.map((n) => n.toString(2).padStart(6, "0"));
255
508
  return chunks.join("");
256
509
  };
257
- var dataArrayStringifier = (dataEntryArray) => {
258
- return dataEntryArray.map(dataBitsStringifier).join("");
259
- };
260
510
  // src/update/floatUpdate.ts
261
511
  var updateValue = (original, update) => {
262
- const value = Math.max(Math.min(update.value, original.max), original.min);
263
- return {
264
- ...original,
265
- value
266
- };
512
+ original.value = Math.max(Math.min(update.value, original.max), original.min);
513
+ return original;
267
514
  };
268
515
 
269
516
  // src/update/intUpdate.ts
270
517
  var updateValue2 = (original, update) => {
271
- const value = Math.max(Math.min(update.value, original.max), original.min);
272
- return {
273
- ...original,
274
- value
275
- };
518
+ original.value = Math.max(Math.min(update.value, original.max), original.min);
519
+ return original;
276
520
  };
277
521
 
278
522
  // src/update/enumUpdate.ts
279
523
  var updateValue3 = (original, update) => {
280
- const value = Math.min(original.max, update.value);
281
- return {
282
- ...original,
283
- value
284
- };
524
+ original.value = Math.min(original.max, update.value);
525
+ return original;
285
526
  };
286
527
 
287
528
  // src/update/versionUpdate.ts
@@ -294,264 +535,253 @@ var updateValue4 = (original, update) => {
294
535
  };
295
536
 
296
537
  // src/update/booleanUpdate.ts
297
- var updateValue5 = (original, update) => ({
298
- ...original,
299
- value: update.value
300
- });
538
+ var updateValue5 = (original, update) => {
539
+ original.value = update.value;
540
+ return original;
541
+ };
301
542
 
302
- // src/update/updateValues.ts
543
+ // src/update/enumArrayUpdate.ts
303
544
  var updateValue6 = (original, update) => {
545
+ const count = Math.max(Math.min(update.value.length, original.maxCount), original.minCount);
546
+ original.value = [...new Array(count)].map((_, i) => Math.min(update.value[i] ?? 0, original.max));
547
+ return original;
548
+ };
549
+
550
+ // src/update/nestedDataMatching.ts
551
+ var updateNestedData = (original, descriptor) => {
552
+ const descriptorClone = JSON.parse(JSON.stringify(descriptor));
553
+ if (!original)
554
+ return descriptorClone;
555
+ return descriptorClone.map((d, i) => original[i]?.type === d.type && original[i]?.name === d.name ? DataTypeValues.includes(original[i].type) ? updateValue7(d, original[i]) : updateComplexValue(d, original[i]) : d);
556
+ };
557
+
558
+ // src/update/optionalUpdate.ts
559
+ var updateComplexValue2 = (original, update) => {
560
+ if (update.descriptor[Number(original.state)] !== null && original.value !== null) {
561
+ original.state = update.state;
562
+ original.value.length = 0;
563
+ original.value.push(...updateNestedData(update.value, original.descriptor[Number(update.state)]));
564
+ }
565
+ return original;
566
+ };
567
+
568
+ // src/update/enumOptionsUpdate.ts
569
+ var updateComplexValue3 = (original, update) => {
570
+ if (update.state <= original.descriptor.length - 1) {
571
+ original.value.length = 0;
572
+ original.value.push(...updateNestedData(update.value, original.descriptor[update.state]));
573
+ original.state = update.state;
574
+ }
575
+ return original;
576
+ };
577
+
578
+ // src/update/arrayUpdate.ts
579
+ var updateComplexValue4 = (original, update) => {
580
+ if (update.state >= original.minCount && update.state <= original.maxCount) {
581
+ original.state = update.state;
582
+ original.value.length = 0;
583
+ for (let i = 0;i < original.state; i++)
584
+ original.value.push(updateNestedData(update.value[i], original.descriptor));
585
+ }
586
+ return original;
587
+ };
588
+
589
+ // src/update/updateValues.ts
590
+ var updateValue7 = (original, update) => {
304
591
  if (original.type !== update.type)
305
592
  throw new Error("Types do not match");
306
593
  switch (original.type) {
307
- case DataType.FLOAT:
594
+ case "FLOAT":
308
595
  return updateValue(original, update);
309
- case DataType.INT:
596
+ case "INT":
310
597
  return updateValue2(original, update);
311
- case DataType.ENUM:
598
+ case "ENUM":
312
599
  return updateValue3(original, update);
313
- case DataType.BOOLEAN:
600
+ case "BOOLEAN":
314
601
  return updateValue5(original, update);
315
- case DataType.VERSION:
602
+ case "VERSION":
316
603
  return updateValue4(original, update);
604
+ case "ENUM_ARRAY":
605
+ return updateValue6(original, update);
317
606
  }
318
607
  };
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";
608
+ var updateComplexValue = (original, update) => {
609
+ if (original.type !== update.type)
610
+ throw new Error("Types do not match");
611
+ switch (original.type) {
612
+ case "OPTIONAL":
613
+ return updateComplexValue2(original, update);
614
+ case "ENUM_OPTIONS":
615
+ return updateComplexValue3(original, update);
616
+ case "ARRAY":
617
+ return updateComplexValue4(original, update);
618
+ }
619
+ };
620
+ // src/stateHandling/stateData.ts
621
+ var getStateData = (state) => {
622
+ const object = {};
623
+ state.forEach((item) => {
624
+ switch (item.type) {
625
+ case "BOOLEAN":
626
+ object[item.name] = item.value;
627
+ break;
628
+ case "INT":
629
+ object[item.name] = item.value;
630
+ break;
631
+ case "ENUM":
632
+ object[item.name] = item.mapping[item.value];
633
+ break;
634
+ case "FLOAT":
635
+ object[item.name] = item.value;
636
+ break;
637
+ case "VERSION":
638
+ object[item.name] = item.value;
639
+ break;
640
+ case "ENUM_ARRAY":
641
+ object[item.name] = item.value.map((v) => item.mapping[v]);
642
+ break;
643
+ case "OPTIONAL":
644
+ object[item.name] = item.value === null ? null : getStateData(item.value);
645
+ break;
646
+ case "ENUM_OPTIONS":
647
+ object[item.name] = {
648
+ ...getStateData(item.value),
649
+ state: item.state
650
+ };
651
+ break;
652
+ case "ARRAY":
653
+ object[item.name] = item.value.map(getStateData);
654
+ break;
655
+ }
656
+ });
657
+ return object;
658
+ };
353
659
 
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);
660
+ // src/stateHandling/stateDataObject.ts
661
+ var getBitstringForStateDataEntry = (stateDataEntry2) => {
662
+ switch (stateDataEntry2.type) {
663
+ case "BOOLEAN":
664
+ case "INT":
665
+ case "ENUM":
666
+ case "FLOAT":
667
+ case "VERSION":
668
+ case "ENUM_ARRAY":
669
+ return stateDataEntry2.bitstring = stateDataEntry2.bitstring ?? dataBitsStringifier(stateDataEntry2);
670
+ case "OPTIONAL":
671
+ return stateDataEntry2.value === null ? complexDataStateStringifier(stateDataEntry2) : complexDataStateStringifier(stateDataEntry2) + getBitstringForStateNestedData(stateDataEntry2.value);
672
+ case "ENUM_OPTIONS":
673
+ return complexDataStateStringifier(stateDataEntry2) + getBitstringForStateNestedData(stateDataEntry2.value);
674
+ case "ARRAY":
675
+ return complexDataStateStringifier(stateDataEntry2) + stateDataEntry2.value.map((vs) => getBitstringForStateNestedData(vs)).join("");
375
676
  }
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
389
- }
390
- ]
391
- ];
392
- };
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);
677
+ };
678
+ var getBitstringForStateNestedData = (nestedData) => nestedData.map(getBitstringForStateDataEntry).join("");
679
+ var setComplexDataEntryValuesAsStateDataEntry = (currenEntry, updateCallback) => {
680
+ switch (currenEntry.type) {
681
+ case "OPTIONAL":
682
+ currenEntry.value = currenEntry.value === null ? null : currenEntry.value.map((v) => getStateDataEntry(v, updateCallback));
683
+ break;
684
+ case "ARRAY":
685
+ currenEntry.value = currenEntry.value.map((vs) => vs.map((v) => getStateDataEntry(v, updateCallback)));
686
+ break;
687
+ case "ENUM_OPTIONS":
688
+ currenEntry.value = currenEntry.value.map((v) => getStateDataEntry(v, updateCallback));
689
+ break;
422
690
  }
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]}`, 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([...Array.isArray(entryToUpdate) ? entryToUpdate : [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);
503
- return {
504
- versionBitCount,
505
- exposedVersions,
506
- parser,
507
- updater,
508
- stringify,
509
- enumSemanticsMapping,
510
- attributeSemanticsMapping
691
+ const newBitString = getBitstringForStateDataEntry(currenEntry);
692
+ currenEntry.bitstring = newBitString;
693
+ };
694
+ var updateStateDataEntry = (currenEntry, newEntry, updateCallback) => {
695
+ if (currenEntry.type !== newEntry.type || currenEntry.name !== newEntry.name)
696
+ throw new Error(`Types (${currenEntry.type} & ${newEntry.type}) or names (${currenEntry.name} & ${newEntry.name}) do not match`);
697
+ if (ComplexDataValues.includes(currenEntry.type)) {
698
+ if (currenEntry.state !== newEntry.state) {
699
+ const currentBitString = currenEntry.bitstring;
700
+ const updatedCurrentEntry = updateComplexValue(currenEntry, newEntry);
701
+ setComplexDataEntryValuesAsStateDataEntry(updatedCurrentEntry, updateCallback);
702
+ if (currentBitString !== updatedCurrentEntry.bitstring)
703
+ updateCallback();
704
+ }
705
+ } else {
706
+ const currentBitString = currenEntry.bitstring;
707
+ const updatedCurrentEntry = updateValue7(currenEntry, newEntry);
708
+ updatedCurrentEntry.bitstring = dataBitsStringifier(updatedCurrentEntry);
709
+ if (currentBitString !== updatedCurrentEntry.bitstring)
710
+ updateCallback();
711
+ }
712
+ return currenEntry;
713
+ };
714
+ var getStateDataEntry = (entry, updateCallback) => {
715
+ entry.bitstring = getBitstringForStateDataEntry(entry);
716
+ entry.updateValue = (newEntry) => updateStateDataEntry(entry, newEntry, updateCallback);
717
+ return entry;
718
+ };
719
+ var createStateDataObject = (initialState, updateCallback) => {
720
+ const stateObject = {};
721
+ const wrappedUpdateCallback = () => {
722
+ stateObject.bitstring = getBitstringForStateNestedData(stateObject.state);
723
+ stateObject.base64 = parseBitsToBase64(stateObject.bitstring);
724
+ stateObject.data = getStateData(stateObject.state);
725
+ updateCallback(stateObject);
511
726
  };
727
+ stateObject.state = initialState.map((item) => getStateDataEntry(item, wrappedUpdateCallback));
728
+ wrappedUpdateCallback();
729
+ return stateObject;
512
730
  };
731
+ var getInitialStateFromBase64 = (base64, descriptor) => nestedDataBitstringParser(parseBase64ToBits(base64), descriptor)[0];
513
732
  // src/utils/interpolateData.ts
514
733
  var interpolateEntryAt = (dataEntry2, t) => {
515
734
  const localT = Math.max(Math.min(1, t), 0);
516
735
  const cosT = Math.cos(localT * 2 * Math.PI) * 0.5 + 0.5;
517
736
  switch (dataEntry2.type) {
518
- case DataType.BOOLEAN:
737
+ case "BOOLEAN":
519
738
  return { ...dataEntry2, value: Boolean(Math.round(localT)) };
520
- case DataType.VERSION:
739
+ case "VERSION":
521
740
  return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.bits ** 2 - 0.001)) };
522
- case DataType.ENUM:
741
+ case "ENUM":
523
742
  return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.max + 0.999)) };
524
- case DataType.INT:
743
+ case "INT":
525
744
  return { ...dataEntry2, value: dataEntry2.min + Math.floor(cosT * (dataEntry2.max - dataEntry2.min + 0.999)) };
526
- case DataType.FLOAT:
745
+ case "FLOAT":
527
746
  const v = dataEntry2.min + cosT * (dataEntry2.max - dataEntry2.min);
528
747
  return dataEntryCorrecting({ ...dataEntry2, value: Math.min(dataEntry2.max, Math.max(v, dataEntry2.min)) });
748
+ case "ENUM_ARRAY":
749
+ return { ...dataEntry2, value: dataEntry2.value.map((v2) => Math.floor(localT * (v2 + 0.999))) };
529
750
  }
530
751
  };
531
752
  // src/utils/relativeValue.ts
532
753
  var getRelativeValue = (dataEntry2) => {
533
754
  switch (dataEntry2.type) {
534
- case DataType.BOOLEAN:
755
+ case "BOOLEAN":
535
756
  return Number(dataEntry2.value);
536
- case DataType.INT:
537
- case DataType.FLOAT:
757
+ case "INT":
758
+ case "FLOAT":
538
759
  return (dataEntry2.value - dataEntry2.min) / (dataEntry2.max - dataEntry2.min);
539
- case DataType.VERSION:
760
+ case "VERSION":
540
761
  return dataEntry2.value / (2 ** dataEntry2.bits - 1);
541
- case DataType.ENUM:
762
+ case "ENUM":
542
763
  return dataEntry2.value / dataEntry2.max;
764
+ case "ENUM_ARRAY":
765
+ return dataEntry2.value.reduce((acc, v) => acc + v, 0) / dataEntry2.value.length;
543
766
  }
544
767
  };
545
768
  export {
769
+ valueBitsParser,
546
770
  parseBase64ToBits,
547
771
  interpolateEntryAt,
548
- getStateValue,
549
772
  getRelativeValue,
550
- getDataEntryArray,
551
- getBase64String,
552
- createParserObject,
773
+ getInitialStateFromBase64,
774
+ getBitsCount7 as getBitsCount,
775
+ dataEntryCorrecting,
776
+ dataEntryBitstringParser,
777
+ dataBitsStringifier,
778
+ dataBitsParser,
779
+ createStateDataObject,
553
780
  SignificandMaxBits,
781
+ PROTECTED_ATTRIBUTE_NAMES,
554
782
  IntegerMaxBits,
555
- DataType,
556
- DataEntryFactory
783
+ DataTypeValues,
784
+ DataEntryFactory,
785
+ ComplexDataValues,
786
+ ComplexDataEntryFactory
557
787
  };