url-safe-bitpacking 0.3.3 → 0.3.5

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
@@ -29,10 +29,10 @@ From a memory footprint perspective there are two types of attributes in an obje
29
29
  | Predefined Bitwidth | **✓** | **✓** | **✓** | **✓** | **✓** | ✗ | ✗ | ✗ | ✗ | ✗ |
30
30
  | Has State Bit | ✗ | ✗ | ✗ | ✗ | ✗ | **✓** | **✓** | **✓** | **✓** | ✗ |
31
31
  | Min Bitwidth | `4` | `1` | `1` | `0` | `0` | `1` | – | – | – | – |
32
- | Max Bitwidth | `10` | `1` | `10` | `21` | `21` | `10` | – | – | – | – |
32
+ | Max Bitwidth | `10` | `1` | `8` | `10` | `21` | `8` | – | – | – | – |
33
33
  | Min State Bitwidth | – | – | – | – | – | `0` | `1` | `1` | `0` | – |
34
34
  | Max State Bitwidth | – | – | – | – | – | `10` | `1` | `10` | `10` | – |
35
- | Max Available States | `1024` | `2` | `1024` | `2097152` | `2097152` | `1024 x 1024` | `2` | `1024` | `1024` | `0` |
35
+ | Max Available States | `1024` | `2` | `256` | `1024` | `2097152` | `1024 x 256` | `2` | `256` | `1024` | - |
36
36
  | Has Mapping | ✗ | ✗ | **✓** | ✗ | ✗ | **✓** | ✗ | **✓** | ✗ | ✗ |
37
37
  | Has Nested Objects | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | **✓** | **✓** | **✓** | **✓** |
38
38
  | **UPDATING** | **VERSION** | **BOOLEAN** | **ENUM** | **INT** | **FLOAT** | **ENUM_ARRAY** | **OPTIONAL** | **ENUM_OPTIONS** | **ARRAY** | **OBJECT** |
@@ -1,3 +1,3 @@
1
- import { DataEntry, EnumOptionsDataEntry, EnumOptionsType } from '../types';
2
- export type EnumOptionsFactory = (descriptor: (DataEntry | null)[], defaultState?: number, name?: string, options?: EnumOptionsType) => EnumOptionsDataEntry;
1
+ import { EnumOptionsDataEntry, EnumOptionsType, ObjectDataEntry } from '../types';
2
+ export type EnumOptionsFactory = (descriptor: (ObjectDataEntry | null)[], defaultState?: number, name?: string, options?: EnumOptionsType) => EnumOptionsDataEntry;
3
3
  export declare const create: EnumOptionsFactory;
@@ -1,3 +1,10 @@
1
1
  import { IntDataEntry } from '../types';
2
2
  export type IntFactory = (value: number, min?: number, max?: number, name?: string) => IntDataEntry;
3
+ /**
4
+ * Method to create an int data entry
5
+ * @param value - `number` default value, should be between `min` and `max`
6
+ * @param min - `number` (default: 0), should be smaller than `max`
7
+ * @param max - `number` (default: 10), should be larger than `min` will be swapped if `min` is larger, the delta between min and max should not be greater than 1023 (max value representable in 10 bits)
8
+ * @param name - `string`
9
+ */
3
10
  export declare const create: IntFactory;
@@ -1,4 +1,32 @@
1
- import { EnumMappingType, EnumOptionsType } from '../types';
1
+ import { DataType } from '@/enums';
2
+ import { EnumMappingType, EnumOptionsType, PrecisionRangeType } from '../types';
3
+ /**
4
+ * Method to validate the state of an unsigned int
5
+ */
6
+ export declare const validateUnsignedInt: (min: number | undefined, max: number, defaultValue: number, name: string, type: DataType, maxBits: number) => {
7
+ min: number;
8
+ value: number;
9
+ max: number;
10
+ bitwidth: number;
11
+ };
12
+ /**
13
+ * Method to validate the state of a signed int
14
+ */
15
+ export declare const validateSignedInt: (min: number, max: number, defaultValue: number, name: string, type: DataType, maxBits: number) => {
16
+ min: number;
17
+ value: number;
18
+ max: number;
19
+ bitwidth: number;
20
+ };
21
+ /**
22
+ * Method to validate FLOAT
23
+ */
24
+ export declare const validateFloat: (min: number, max: number, defaultValue: number, precision: PrecisionRangeType, name: string, type: DataType, maxBits: number) => {
25
+ min: number;
26
+ value: number;
27
+ max: number;
28
+ bitwidth: number;
29
+ };
2
30
  /**
3
31
  * Method to get the max and mapping from the options
4
32
  * @param options - `any[] | string | number` the options to get the max and mapping from
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { DataType, HasMappingDataTypes, HasStateBitsDataTypes, HasChildDataTypes, HasChildrenDataTypes, HasNestedDataTypes, ValueUpdateDataTypes, StateUpdateDataTypes } from './enums';
2
- export { VersionDataEntry, BooleanDataEntry, EnumDataEntry, IntDataEntry, FloatDataEntry, EnumArrayDataEntry, ObjectDataEntry, OptionalDataEntry, EnumOptionsDataEntry, ArrayDataEntry, PrecisionRangeType, SignificandMaxBits, IntegerMaxBits, VersionRangeType, DataEntry, ProtectedAttributeNames, EnumOptionsType, EnumMappingType, PROTECTED_ATTRIBUTE_NAMES, StateDataObject, StateDataObjectValue } from './types';
2
+ export { VersionDataEntry, BooleanDataEntry, EnumDataEntry, IntDataEntry, FloatDataEntry, EnumArrayDataEntry, ObjectDataEntry, OptionalDataEntry, EnumOptionsDataEntry, ArrayDataEntry, PrecisionRange, PrecisionRangeType, SignificandMaxBits, IntegerMaxBits, VersionRangeType, DataEntry, ProtectedAttributeNames, EnumOptionsType, EnumMappingType, PROTECTED_ATTRIBUTE_NAMES, StateDataObject, StateDataObjectValue } from './types';
3
3
  export { getBitsCount, dataEntryBitstringParser, dataEntryCorrecting, dataEntryBitsStringifier, parseBase64ToBits } from './parsers';
4
4
  export { SpecificTypeNode, NodeFactory, GetStateNodeTree, FromState, VersionNode, ArrayNode, BooleanNode, EnumNode, IntNode, FloatNode, EnumArrayNode, OptionalNode, EnumOptionsNode, ObjectNode, StateNode, getStateData } from './stateHandling';
5
5
  export { interpolateEntryAt, getRelativeValue } from './utils';
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@ var StateUpdateDataTypes = ["OPTIONAL", "ENUM_OPTIONS", "ARRAY"];
9
9
  // src/types/enumData.ts
10
10
  var EnumMaxBits = 8;
11
11
  // src/types/floatData.ts
12
+ var PrecisionRange = [-3, -2, -1, 0, 1, 2, 3, 4];
12
13
  var SignificandMaxBits = 20;
13
14
  // src/types/intData.ts
14
15
  var IntegerMaxBits = 12;
@@ -271,10 +272,6 @@ var simpleFromValueParser = (bitString, entry) => {
271
272
  }
272
273
  };
273
274
  var dataEntryBitstringParser = (entry, bitString) => {
274
- const result = _dataEntryBitstringParser(entry, bitString);
275
- return result;
276
- };
277
- var _dataEntryBitstringParser = (entry, bitString) => {
278
275
  switch (entry.type) {
279
276
  case "BOOLEAN":
280
277
  case "INT":
@@ -459,43 +456,74 @@ var updateStateEntry = (original, update) => {
459
456
  return updateState3(original, update);
460
457
  }
461
458
  };
462
- // src/factory/helperMethod.ts
463
- var getBitsForIntegerNumber = (number, maxBits) => {
464
- const bitCount = Math.ceil(Math.log2(number));
465
- if (bitCount > maxBits)
466
- throw new Error(`Cannot get ${maxBits} bits for a number with ${bitCount} bits`);
467
- return bitCount;
459
+ // src/factory/utils.ts
460
+ var validateBitsCount = (stateCount, maxBitWidth, name, type) => {
461
+ const bitCountForStateCount = Math.ceil(Math.log2(stateCount));
462
+ if (bitCountForStateCount > maxBitWidth)
463
+ throw new Error(`Cannot store ${stateCount} state in ${maxBitWidth} bits for ${name} ${type} you would need ${bitCountForStateCount} bits`);
464
+ return bitCountForStateCount;
465
+ };
466
+ var validateUnsignedInt = (min, max, defaultValue, name, type, maxBits) => {
467
+ if (min === undefined || min < 0)
468
+ min = 0;
469
+ if (!Number.isInteger(min))
470
+ min = Math.floor(min);
471
+ if (!Number.isInteger(max))
472
+ max = Math.floor(max);
473
+ [min, max] = [min, max].sort((a, b) => a - b);
474
+ const bitwidth = validateBitsCount(max - min + 1, maxBits, name, type);
475
+ if (!Number.isInteger(defaultValue))
476
+ defaultValue = Math.floor(defaultValue);
477
+ return { min, value: Math.max(min, Math.min(defaultValue, max)), max, bitwidth };
478
+ };
479
+ var validateSignedInt = (min, max, defaultValue, name, type, maxBits) => {
480
+ if (!Number.isInteger(min))
481
+ min = Math.floor(min);
482
+ if (!Number.isInteger(max))
483
+ max = Math.floor(max);
484
+ if (!Number.isInteger(defaultValue))
485
+ defaultValue = Math.floor(defaultValue);
486
+ [min, max] = [min, max].sort((a, b) => a - b);
487
+ const bitwidth = validateBitsCount(max - min + 1, maxBits, name, type);
488
+ return { min, value: Math.max(min, Math.min(Math.round(defaultValue), max)), max, bitwidth };
489
+ };
490
+ var validateFloat = (min, max, defaultValue, precision, name, type, maxBits) => {
491
+ if (!PrecisionRange.includes(precision))
492
+ throw new Error(`Precision ${precision} is not valid for ${name} ${type}`);
493
+ const precisionMultiplier = 10 ** precision;
494
+ min = Math.floor(min * precisionMultiplier);
495
+ max = Math.floor(max * precisionMultiplier);
496
+ [min, max] = [min, max].sort((a, b) => a - b);
497
+ const bitwidth = validateBitsCount(max - min + 1, maxBits, name, type);
498
+ [min, max] = [min, max].map((v) => v / precisionMultiplier);
499
+ const value = Math.max(min, Math.min(Math.round(defaultValue * precisionMultiplier) / precisionMultiplier, max));
500
+ return { min, value, max, bitwidth };
501
+ };
502
+ var getEnumMaxAndMappingFromOptions = (options) => {
503
+ if (typeof options === "string")
504
+ return { max: options.length - 1, mapping: options.split("") };
505
+ if (typeof options === "number")
506
+ return { max: options, mapping: Array.from({ length: options + 1 }, (_, i) => i) };
507
+ return { max: options.length - 1, mapping: options };
508
+ };
509
+ var getOptionsFromMaxAndMapping = (v) => {
510
+ if (v.mapping.every((option) => typeof option === "string" && option.length === 1))
511
+ return v.mapping.join("");
512
+ if (Array.from({ length: v.max + 1 }, (_, i) => i).every((option, i) => option === v.mapping[i]))
513
+ return v.max;
514
+ return v.mapping;
468
515
  };
469
- var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v + 1));
470
516
 
471
517
  // src/factory/floatFactory.ts
472
518
  var create = (value, min = 0, max = 1, precision = 2, name = "a float") => {
473
- const precisionMultiplier = 10 ** precision;
474
- const roundedMin = Math.floor(min * precisionMultiplier);
475
- const roundedMax = Math.ceil(max * precisionMultiplier);
476
- const delta = roundedMax - roundedMin;
477
- const significand = Math.max(1, getBitsForIntegerNumber(delta, SignificandMaxBits));
478
- return {
479
- value,
480
- type: "FLOAT",
481
- min: roundedMin / precisionMultiplier,
482
- max: roundedMax / precisionMultiplier,
483
- precision,
484
- significand,
485
- name
486
- };
519
+ const r = validateFloat(min, max, value, precision, name, "FLOAT", SignificandMaxBits);
520
+ return { value: r.value, type: "FLOAT", min: r.min, max: r.max, precision, significand: r.bitwidth, name };
487
521
  };
488
522
 
489
523
  // src/factory/intFactory.ts
490
524
  var create2 = (value, min = 0, max = 10, name = "an int") => {
491
- if (!Number.isInteger(min) || !Number.isInteger(max))
492
- throw new Error("min and max must be integers");
493
- if (max - min < 1)
494
- throw new Error("max must be at least one");
495
- if (Math.abs(max - min) > 2 ** IntegerMaxBits - 1)
496
- throw new Error("max - min must be less than 1024");
497
- const bits = getBitsForIntegerNumber(max - min + 1, IntegerMaxBits);
498
- return { value, type: "INT", min, max, bits, name };
525
+ const r = validateSignedInt(min, max, value, name, "INT", IntegerMaxBits);
526
+ return { value, type: "INT", min: r.min, max: r.max, bits: r.bitwidth, name };
499
527
  };
500
528
 
501
529
  // src/factory/booleanFactory.ts
@@ -506,82 +534,31 @@ var create3 = (value, name = "a boolean") => ({
506
534
  });
507
535
 
508
536
  // src/factory/versionFactory.ts
509
- var create4 = (value, bits = 8, name = "a version") => ({
510
- value,
511
- type: "VERSION",
512
- bits,
513
- name
514
- });
515
-
516
- // src/factory/utils.ts
517
- var getEnumMaxAndMappingFromOptions = (options) => {
518
- if (typeof options === "string")
519
- return { max: options.length - 1, mapping: options.split("") };
520
- if (typeof options === "number")
521
- return { max: options, mapping: Array.from({ length: options + 1 }, (_, i) => i) };
522
- return { max: options.length - 1, mapping: options };
523
- };
524
- var getOptionsFromMaxAndMapping = (v) => {
525
- if (v.mapping.every((option) => typeof option === "string" && option.length === 1))
526
- return v.mapping.join("");
527
- if (Array.from({ length: v.max + 1 }, (_, i) => i).every((option, i) => option === v.mapping[i]))
528
- return v.max;
529
- return v.mapping;
537
+ var create4 = (value, bits = 8, name = "a version") => {
538
+ if (!Number.isInteger(value))
539
+ value = Math.floor(value);
540
+ value = Math.max(0, Math.min(2 ** bits - 1, value));
541
+ return {
542
+ value,
543
+ type: "VERSION",
544
+ bits,
545
+ name
546
+ };
530
547
  };
531
548
 
532
549
  // src/factory/enumFactory.ts
533
550
  var create5 = (value, options, name = "an enum") => {
534
551
  const { max, mapping } = getEnumMaxAndMappingFromOptions(options);
535
- if (!Number.isInteger(max))
536
- throw new Error(`max must be integers, you have given ${max}`);
537
- if (max < 1)
538
- throw new Error("max must be at least one");
539
- if (max > 2 ** EnumMaxBits - 1)
540
- throw new Error("max - min must be less than 256");
541
- const bits = getBitsForIntegerNumber(max + 1, EnumMaxBits);
542
- return { value, type: "ENUM", max, bits, name, mapping };
552
+ const r = validateUnsignedInt(0, max, value, name, "ENUM", EnumMaxBits);
553
+ return { value: r.value, type: "ENUM", max: r.max, bits: r.bitwidth, name, mapping };
543
554
  };
544
555
 
545
556
  // src/factory/enumArrayFactory.ts
546
- var minEnumArrayCount = 0;
547
- var maxOptionsCount = 1024;
548
- var create6 = (value, options, minCount = minEnumArrayCount, maxCount = 10, name = "enum array") => {
557
+ var create6 = (value, options, minCount = 0, maxCount = 10, name = "enum array") => {
549
558
  const { max, mapping } = getEnumMaxAndMappingFromOptions(options);
550
- if (!Number.isInteger(max))
551
- throw new Error(`max must be integers, you have given ${max}`);
552
- if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
553
- throw new Error("minCount and maxCount must be integers");
554
- if (max < 1)
555
- throw new Error("must have at least one option");
556
- if (max > maxOptionsCount)
557
- throw new Error(`maximum allowed options is 1024, you have given ${max + 1} options`);
558
- minCount = Math.min(minCount, maxCount);
559
- maxCount = Math.max(minCount, maxCount);
560
- if (minCount < 0)
561
- throw new Error("minCount can't be negative");
562
- if (maxCount - minCount < 0)
563
- throw new Error(`count range length must be positive, given count range length is ${Math.abs(maxCount - minCount)}`);
564
- if (Math.abs(maxCount - minCount) > 2 ** IntegerMaxBits - 1)
565
- throw new Error(`count range length must be less than 1024, given count range length is ${Math.abs(maxCount - minCount)}`);
566
- value.forEach((v, i) => {
567
- if (!Number.isInteger(v))
568
- throw new Error(`all entries must be integers, index ${i} (${v}) is not`);
569
- if (v > max)
570
- throw new Error(`all entries must be within the range ${0} - ${max}, index ${i} (${v}) is not`);
571
- });
572
- if (value.length < minCount || value.length > maxCount)
573
- throw new Error(`value length must be between minCount and maxCount, ${value.length} is not between ${minCount} and ${maxCount}`);
574
- const stateBits = getBitsForIntegerNumber(maxCount - minCount + 1, IntegerMaxBits);
575
- return {
576
- type: "ENUM_ARRAY",
577
- minCount,
578
- maxCount,
579
- value: JSON.parse(JSON.stringify(value)),
580
- max,
581
- name,
582
- mapping,
583
- stateBits
584
- };
559
+ const r = validateUnsignedInt(minCount, maxCount, value.length, name, "ENUM_ARRAY", IntegerMaxBits);
560
+ value = Array.from({ length: r.value }, (_, i) => validateUnsignedInt(0, max, value[i] ?? 0, `${name}[${i}]`, "ENUM_ARRAY", EnumMaxBits).value);
561
+ return { type: "ENUM_ARRAY", minCount: r.min, maxCount: r.max, value, max, name, mapping, stateBits: r.bitwidth };
585
562
  };
586
563
 
587
564
  // src/factory/optionalFactory.ts
@@ -600,6 +577,15 @@ var create7 = (descriptor, defaultState = false, name = "an optional") => {
600
577
  };
601
578
  };
602
579
 
580
+ // src/factory/helperMethod.ts
581
+ var getBitsForIntegerNumber = (number, maxBits) => {
582
+ const bitCount = Math.ceil(Math.log2(number));
583
+ if (bitCount > maxBits)
584
+ throw new Error(`Cannot get ${maxBits} bits for a number with ${bitCount} bits`);
585
+ return bitCount;
586
+ };
587
+ var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v + 1));
588
+
603
589
  // src/factory/enumOptionsFactory.ts
604
590
  var maxEnumOptions = 64;
605
591
  var maxEnumOptionsBits = getMinimumBitsForInteger(maxEnumOptions);
@@ -628,29 +614,16 @@ var create8 = (descriptor, defaultState = 0, name = "enum options", options) =>
628
614
  };
629
615
 
630
616
  // src/factory/arrayFactory.ts
631
- var maxArrayCount = 1024;
632
617
  var create9 = (descriptor, defaultState = 0, minCount = 0, maxCount = 10, name = "an array") => {
633
- if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
634
- throw new Error("minCount and maxCount must be integers");
635
- if (minCount < 0)
636
- throw new Error("minCount must be at least 0");
637
- if (maxCount < 0)
638
- throw new Error("maxCount must be at least 0");
639
- if (maxCount - minCount < 0)
640
- throw new Error("maxCount must be greater than or equal to minCount");
641
- if (maxCount - minCount > maxArrayCount)
642
- throw new Error(`maxCount (${maxCount}) - minCount (${minCount}) = ${maxCount - minCount} must be less than or equal to maxArrayCount (${maxArrayCount})`);
643
- if (defaultState < minCount || defaultState > maxCount)
644
- throw new Error(`defaultState must be between minCount (${minCount}) and maxCount (${maxCount}), given defaultState is ${defaultState}`);
645
- const stateBits = getMinimumBitsForInteger(maxCount - minCount);
618
+ const r = validateUnsignedInt(minCount, maxCount, defaultState, name, "ARRAY", IntegerMaxBits);
646
619
  return {
647
- value: [...Array(defaultState)].map(() => JSON.parse(JSON.stringify(descriptor))),
620
+ value: [...Array(r.value)].map(() => JSON.parse(JSON.stringify(descriptor))),
648
621
  descriptor,
649
622
  type: "ARRAY",
650
- minCount,
651
- maxCount,
652
- stateBits,
653
- state: defaultState,
623
+ minCount: r.min,
624
+ maxCount: r.max,
625
+ stateBits: r.bitwidth,
626
+ state: r.value,
654
627
  name
655
628
  };
656
629
  };
@@ -661,8 +634,7 @@ var create10 = (descriptor, name = "an object") => {
661
634
  type: "OBJECT",
662
635
  descriptor,
663
636
  value: descriptor,
664
- name,
665
- stateBits: 0
637
+ name
666
638
  };
667
639
  };
668
640
 
@@ -841,7 +813,10 @@ class EnumOptionsNode extends ComplexStateNodes {
841
813
  getChildren = () => [this.child];
842
814
  getStateBits = () => rawStateStringifier4(this.state, this.descriptor.stateBits);
843
815
  getValueBits = () => this.child ? this.child.bitstring : "";
844
- initializedChild = () => this.descriptor.descriptor[this.state] ? NodeFactory(this.descriptor.descriptor[this.state], this) : null;
816
+ initializedChild = () => {
817
+ const validatedEntry = validateDataEntry(this.descriptor.descriptor[this.state], this.descriptor.value);
818
+ return validatedEntry ? NodeFactory(validatedEntry, this) : null;
819
+ };
845
820
  updateState = (newState) => {
846
821
  const constrainedNewState = constrainState2(this.descriptor.descriptor.length, newState);
847
822
  if (constrainedNewState === this.state)
@@ -872,7 +847,7 @@ class ArrayNode extends ComplexStateNodes {
872
847
  this.children = this.initializedChildren();
873
848
  this.bitstring = this.getBitString();
874
849
  }
875
- initializedChildren = () => this.descriptor.value.map((child) => NodeFactory(child, this));
850
+ initializedChildren = () => this.descriptor.value.map((entry) => NodeFactory(validateDataEntry(this.descriptor.descriptor, entry), this));
876
851
  getChildren = () => this.children;
877
852
  getStateBits = () => rawStateStringifier2(this.state, this.descriptor.minCount, this.descriptor.stateBits);
878
853
  getValueBits = () => this.children.map((child) => child.bitstring).join("");
@@ -954,6 +929,7 @@ var getObjectForDataEntries = (entries) => {
954
929
  });
955
930
  return object;
956
931
  };
932
+ var getStringForDataEntries = (values) => Array.isArray(values) && values.every((v) => typeof v === "string" && v.length === 1) ? values.join("") : values;
957
933
  var getStateData = (entry) => {
958
934
  switch (entry.type) {
959
935
  case "BOOLEAN":
@@ -964,7 +940,7 @@ var getStateData = (entry) => {
964
940
  case "ENUM":
965
941
  return entry.mapping[entry.value];
966
942
  case "ENUM_ARRAY":
967
- return entry.value.map((v) => entry.mapping[v]);
943
+ return getStringForDataEntries(entry.value.map((v) => entry.mapping[v]));
968
944
  case "OPTIONAL":
969
945
  return entry.value === null ? null : getStateData(entry.value);
970
946
  case "ENUM_OPTIONS":
@@ -973,7 +949,7 @@ var getStateData = (entry) => {
973
949
  switch (entry.value.type) {
974
950
  case "OBJECT":
975
951
  return {
976
- ...getStateData(entry.value),
952
+ ...getObjectForDataEntries(entry.value.value),
977
953
  state
978
954
  };
979
955
  default:
@@ -984,7 +960,7 @@ var getStateData = (entry) => {
984
960
  case "OBJECT":
985
961
  return getObjectForDataEntries(entry.value);
986
962
  case "ARRAY":
987
- return entry.value.map((v) => getStateData(v));
963
+ return getStringForDataEntries(entry.value.map(getStateData));
988
964
  }
989
965
  };
990
966
  // src/utils/interpolateData.ts
@@ -1035,6 +1011,7 @@ export {
1035
1011
  StateUpdateDataTypes,
1036
1012
  StateNode,
1037
1013
  SignificandMaxBits,
1014
+ PrecisionRange,
1038
1015
  PROTECTED_ATTRIBUTE_NAMES,
1039
1016
  OptionalNode,
1040
1017
  ObjectNode,
@@ -9,6 +9,13 @@ export declare const getStateBitsForDataEntry: (entry: DataEntry & {
9
9
  * @param entry - `DataEntry`
10
10
  */
11
11
  export declare const getContentBitsCountForDataEntry: (entry: DataEntry) => number;
12
+ /**
13
+ * Method that parses a bitstring into a value
14
+ *
15
+ * @param bitString - `string` of 0 | 1
16
+ * @param entry - `DataEntry` that represents the data entry to parse
17
+ * @returns `number` | `boolean` that represents the parsed value
18
+ */
12
19
  export declare const dataEntryBitstringParser: <T extends DataEntry>(entry: T, bitString: string) => [T, string];
13
20
  /**
14
21
  * Method that returns the amount of bits required for a given data entry
@@ -1,10 +1,10 @@
1
- import { DataEntry } from './dataEntry';
1
+ import { ObjectDataEntry } from './dataEntry';
2
2
  import { EnumMappingType } from './enumData';
3
3
  export type EnumOptionsData = {
4
4
  type: 'ENUM_OPTIONS';
5
5
  stateBits: number;
6
6
  state: number;
7
- descriptor: (DataEntry | null)[];
7
+ descriptor: (ObjectDataEntry | null)[];
8
8
  mapping: EnumMappingType;
9
- value: DataEntry | null;
9
+ value: ObjectDataEntry | null;
10
10
  };
@@ -1,4 +1,5 @@
1
- export type PrecisionRangeType = -3 | -2 | -1 | 0 | 1 | 2 | 3;
1
+ export declare const PrecisionRange: readonly [-3, -2, -1, 0, 1, 2, 3, 4];
2
+ export type PrecisionRangeType = (typeof PrecisionRange)[number];
2
3
  export declare const SignificandMaxBits = 20;
3
4
  /**
4
5
  * Float object
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "dist/*"
7
7
  ],
8
8
  "type": "module",
9
- "version": "0.3.3",
9
+ "version": "0.3.5",
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": {