@axi-engine/fields 0.2.3 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -142,13 +142,13 @@ function createTypedMethodsMixin(typeName, baseMethodName) {
142
142
  };
143
143
  }
144
144
 
145
- // src/field-definitions/default-field.ts
145
+ // src/field-definitions/core-field.ts
146
146
  import { Emitter } from "@axi-engine/utils";
147
147
  import { dequal } from "dequal";
148
- var DefaultField = class _DefaultField {
148
+ var CoreField = class _CoreField {
149
149
  /** A type keyword of the field */
150
150
  static typeName = "default";
151
- typeName = _DefaultField.typeName;
151
+ typeName = _CoreField.typeName;
152
152
  /** A unique identifier for the field. */
153
153
  _name;
154
154
  _value;
@@ -209,10 +209,10 @@ var DefaultField = class _DefaultField {
209
209
  }
210
210
  };
211
211
 
212
- // src/field-definitions/default-boolean-field.ts
213
- var DefaultBooleanField = class _DefaultBooleanField extends DefaultField {
212
+ // src/field-definitions/core-boolean-field.ts
213
+ var CoreBooleanField = class _CoreBooleanField extends CoreField {
214
214
  static typeName = "boolean";
215
- typeName = _DefaultBooleanField.typeName;
215
+ typeName = _CoreBooleanField.typeName;
216
216
  constructor(name, initialVal, options) {
217
217
  super(name, initialVal, options);
218
218
  }
@@ -222,10 +222,10 @@ var DefaultBooleanField = class _DefaultBooleanField extends DefaultField {
222
222
  }
223
223
  };
224
224
 
225
- // src/field-definitions/default-string-field.ts
226
- var DefaultStringField = class _DefaultStringField extends DefaultField {
225
+ // src/field-definitions/core-string-field.ts
226
+ var CoreStringField = class _CoreStringField extends CoreField {
227
227
  static typeName = "string";
228
- typeName = _DefaultStringField.typeName;
228
+ typeName = _CoreStringField.typeName;
229
229
  constructor(name, initialVal, options) {
230
230
  super(name, initialVal, options);
231
231
  }
@@ -249,11 +249,11 @@ var DefaultStringField = class _DefaultStringField extends DefaultField {
249
249
  }
250
250
  };
251
251
 
252
- // src/field-definitions/default-numeric-field.ts
252
+ // src/field-definitions/core-numeric-field.ts
253
253
  import { isNullOrUndefined } from "@axi-engine/utils";
254
- var DefaultNumericField = class _DefaultNumericField extends DefaultField {
254
+ var CoreNumericField = class _CoreNumericField extends CoreField {
255
255
  static typeName = "numeric";
256
- typeName = _DefaultNumericField.typeName;
256
+ typeName = _CoreNumericField.typeName;
257
257
  get min() {
258
258
  const policy = this.policies.get(ClampPolicy.id) ?? this.policies.get(ClampMinPolicy.id);
259
259
  return policy?.min;
@@ -433,9 +433,9 @@ var Fields = class _Fields {
433
433
  }
434
434
  /**
435
435
  * Retrieves a field by its name.
436
- * @template T - The expected `Field` type to be returned.
436
+ * @template TField - The expected `Field` type to be returned.
437
437
  * @param {string} name - The name of the field to retrieve.
438
- * @returns {T} The `Field` instance.
438
+ * @returns {TField} The `Field` instance.
439
439
  * @throws If the field does not exist.
440
440
  */
441
441
  get(name) {
@@ -475,34 +475,6 @@ var Fields = class _Fields {
475
475
  }
476
476
  };
477
477
 
478
- // src/mixins/with-boolean-fields.mixin.ts
479
- var WithBooleanFields = createTypedMethodsMixin(DefaultBooleanField.typeName, "Boolean");
480
-
481
- // src/mixins/with-string-fields.mixin.ts
482
- var WithStringFields = createTypedMethodsMixin(DefaultBooleanField.typeName, "String");
483
-
484
- // src/mixins/with-numeric-fields.mixin.ts
485
- var WithNumericFields = createTypedMethodsMixin(DefaultBooleanField.typeName, "Numeric");
486
-
487
- // src/mixins/with-default-generic-fields.mixin.ts
488
- function WithDefaultGenericFields(Base) {
489
- return class FieldsWithDefaultGeneric extends Base {
490
- createGeneric(name, initialValue, options) {
491
- return this.create(DefaultField.typeName, name, initialValue, options);
492
- }
493
- upsetGeneric(name, value, options) {
494
- return this.upset(DefaultField.typeName, name, value, options);
495
- }
496
- getGeneric(name) {
497
- return this.get(name);
498
- }
499
- };
500
- }
501
-
502
- // src/default-fields.ts
503
- var DefaultFields = class extends WithBooleanFields(WithStringFields(WithNumericFields(WithDefaultGenericFields(Fields)))) {
504
- };
505
-
506
478
  // src/field-tree.ts
507
479
  import { Emitter as Emitter3, ensurePathArray, ensurePathString, throwIf as throwIf3, throwIfEmpty as throwIfEmpty2 } from "@axi-engine/utils";
508
480
  var FieldTree = class _FieldTree {
@@ -543,7 +515,7 @@ var FieldTree = class _FieldTree {
543
515
  }
544
516
  /**
545
517
  * Creates an instance of FieldTree.
546
- * @param {TreeNodeFactory} factory - A factory responsible for creating new nodes within the tree.
518
+ * @param {FieldTreeFactory} factory - A factory responsible for creating new nodes within the tree.
547
519
  */
548
520
  constructor(factory) {
549
521
  this._factory = factory;
@@ -682,6 +654,16 @@ var FieldTree = class _FieldTree {
682
654
  const traversedPath = this.traversePath(path, true);
683
655
  return traversedPath.branch.has(traversedPath.leafName) ? traversedPath.branch.getFields(traversedPath.leafName) : traversedPath.branch.createFields(traversedPath.leafName);
684
656
  }
657
+ /**
658
+ * Finds the parent node for a given path.
659
+ * @param path The path to the target node.
660
+ * @returns The parent node (either a FieldTree or Fields).
661
+ * @throws An error if the path is invalid or any intermediate node is not a FieldTree.
662
+ */
663
+ findParentNode(path) {
664
+ const info = this.traversePath(path);
665
+ return info.branch;
666
+ }
685
667
  /**
686
668
  * Removes all child nodes from this tree branch.
687
669
  * This method ensures that `destroy()` is called on each child node, allowing for
@@ -733,21 +715,59 @@ var FieldTree = class _FieldTree {
733
715
  }
734
716
  };
735
717
 
736
- // src/field-tree-node-factory.ts
737
- var DefaultFieldsFactory = class {
718
+ // src/mixins/with-boolean-fields.mixin.ts
719
+ var WithBooleanFields = createTypedMethodsMixin(CoreBooleanField.typeName, "Boolean");
720
+
721
+ // src/mixins/with-string-fields.mixin.ts
722
+ var WithStringFields = createTypedMethodsMixin(CoreBooleanField.typeName, "String");
723
+
724
+ // src/mixins/with-numeric-fields.mixin.ts
725
+ var WithNumericFields = createTypedMethodsMixin(CoreBooleanField.typeName, "Numeric");
726
+
727
+ // src/mixins/with-default-generic-fields.mixin.ts
728
+ function WithDefaultGenericFields(Base) {
729
+ return class FieldsWithDefaultGeneric extends Base {
730
+ createGeneric(name, initialValue, options) {
731
+ return this.create(CoreField.typeName, name, initialValue, options);
732
+ }
733
+ upsetGeneric(name, value, options) {
734
+ return this.upset(CoreField.typeName, name, value, options);
735
+ }
736
+ getGeneric(name) {
737
+ return this.get(name);
738
+ }
739
+ };
740
+ }
741
+
742
+ // src/core-fields.ts
743
+ var CoreFields = class extends WithBooleanFields(WithStringFields(WithNumericFields(WithDefaultGenericFields(Fields)))) {
744
+ };
745
+
746
+ // src/core-fields-factory.ts
747
+ var CoreFieldsFactory = class {
748
+ _fieldRegistry;
749
+ get fieldRegistry() {
750
+ return this._fieldRegistry;
751
+ }
738
752
  constructor(fieldRegistry) {
739
- this.fieldRegistry = fieldRegistry;
753
+ this._fieldRegistry = fieldRegistry;
740
754
  }
741
755
  fields() {
742
- return new DefaultFields(this.fieldRegistry);
756
+ return new CoreFields(this._fieldRegistry);
743
757
  }
744
758
  };
745
- var DefaultTreeNodeFactory = class extends DefaultFieldsFactory {
759
+
760
+ // src/core-field-tree.ts
761
+ var CoreFieldTree = class extends FieldTree {
762
+ };
763
+
764
+ // src/core-field-tree-factory.ts
765
+ var CoreTreeNodeFactory = class extends CoreFieldsFactory {
746
766
  constructor(fieldRegistry) {
747
767
  super(fieldRegistry);
748
768
  }
749
769
  tree() {
750
- return new FieldTree(this);
770
+ return new CoreFieldTree(this);
751
771
  }
752
772
  };
753
773
 
@@ -968,6 +988,196 @@ var FieldTreeSerializer = class {
968
988
  return tree;
969
989
  }
970
990
  };
991
+
992
+ // src/data-store-field-resolver.ts
993
+ import { isBoolean, isNumber, isString as isString2 } from "@axi-engine/utils";
994
+ var NumericFieldResolver = class {
995
+ typeName = CoreNumericField.typeName;
996
+ supports(value) {
997
+ return isNumber(value);
998
+ }
999
+ };
1000
+ var BooleanFieldResolver = class {
1001
+ typeName = CoreBooleanField.typeName;
1002
+ supports(value) {
1003
+ return isBoolean(value);
1004
+ }
1005
+ };
1006
+ var StringFieldResolver = class {
1007
+ typeName = CoreStringField.typeName;
1008
+ supports(value) {
1009
+ return isString2(value);
1010
+ }
1011
+ };
1012
+
1013
+ // src/data-store.ts
1014
+ import { ensurePathArray as ensurePathArray2, ensurePathString as ensurePathString2, throwIfEmpty as throwIfEmpty5 } from "@axi-engine/utils";
1015
+ var DataStore = class {
1016
+ constructor(tree) {
1017
+ this.tree = tree;
1018
+ this.registerResolver(new NumericFieldResolver());
1019
+ this.registerResolver(new BooleanFieldResolver());
1020
+ this.registerResolver(new StringFieldResolver());
1021
+ }
1022
+ resolvers = [];
1023
+ rootFieldsName = "__root_fields";
1024
+ _rootFields;
1025
+ get rootFields() {
1026
+ if (!this._rootFields) {
1027
+ this._rootFields = this.tree.getOrCreateFields(this.rootFieldsName);
1028
+ }
1029
+ return this._rootFields;
1030
+ }
1031
+ registerResolver(resolver) {
1032
+ this.resolvers.unshift(resolver);
1033
+ }
1034
+ clearResolvers() {
1035
+ this.resolvers.length = 0;
1036
+ }
1037
+ getValue(path) {
1038
+ return this.getField(path).value;
1039
+ }
1040
+ setValue(path, val) {
1041
+ const field = this.getField(path);
1042
+ field.value = val;
1043
+ return field.value;
1044
+ }
1045
+ createValue(path, val, options) {
1046
+ const dest = this.getDestinationFields(path);
1047
+ if (options?.fieldType) {
1048
+ return dest.fields.create(options.fieldType, dest.leafName, val, options).value;
1049
+ }
1050
+ for (let resolver of this.resolvers) {
1051
+ if (resolver.supports(val)) {
1052
+ return dest.fields.create(resolver.typeName, dest.leafName, val, options).value;
1053
+ }
1054
+ }
1055
+ return dest.fields.createGeneric(dest.leafName, val, options).value;
1056
+ }
1057
+ upsetValue(path, val, options) {
1058
+ const dest = this.getDestinationFields(path);
1059
+ if (options?.fieldType) {
1060
+ return dest.fields.upset(options.fieldType, dest.leafName, val, options).value;
1061
+ }
1062
+ for (let resolver of this.resolvers) {
1063
+ if (resolver.supports(val)) {
1064
+ return dest.fields.upset(resolver.typeName, dest.leafName, val, options).value;
1065
+ }
1066
+ }
1067
+ return dest.fields.upsetGeneric(dest.leafName, val, options).value;
1068
+ }
1069
+ createBoolean(path, initialValue, options) {
1070
+ const dest = this.getDestinationFields(path);
1071
+ return dest.fields.createBoolean(dest.leafName, initialValue, options);
1072
+ }
1073
+ createNumeric(path, initialValue, options) {
1074
+ const dest = this.getDestinationFields(path);
1075
+ return dest.fields.createNumeric(dest.leafName, initialValue, options);
1076
+ }
1077
+ createString(path, initialValue, options) {
1078
+ const dest = this.getDestinationFields(path);
1079
+ return dest.fields.createString(dest.leafName, initialValue, options);
1080
+ }
1081
+ createGeneric(path, initialValue, options) {
1082
+ const dest = this.getDestinationFields(path);
1083
+ return dest.fields.createGeneric(dest.leafName, initialValue, options);
1084
+ }
1085
+ getBoolean(path) {
1086
+ return this.getField(path);
1087
+ }
1088
+ getNumeric(path) {
1089
+ return this.getField(path);
1090
+ }
1091
+ getString(path) {
1092
+ return this.getField(path);
1093
+ }
1094
+ getGeneric(path) {
1095
+ return this.getField(path);
1096
+ }
1097
+ getField(path) {
1098
+ const pathArr = ensurePathArray2(path);
1099
+ throwIfEmpty5(pathArr, `Wrong path or path is empty: ${ensurePathString2(path)}, should contain at least one path segment`);
1100
+ if (this.isPathToRootFields(pathArr)) {
1101
+ return this.rootFields.get(pathArr[0]);
1102
+ }
1103
+ const fieldName = pathArr.pop();
1104
+ const fields = this.tree.getFields(pathArr);
1105
+ return fields.get(fieldName);
1106
+ }
1107
+ createFields(path) {
1108
+ return this.tree.createFields(path, true);
1109
+ }
1110
+ createTree(path) {
1111
+ return this.tree.createFieldTree(path, true);
1112
+ }
1113
+ getFields(path) {
1114
+ return this.tree.getFields(path);
1115
+ }
1116
+ getTree(path) {
1117
+ return this.tree.getFieldTree(path);
1118
+ }
1119
+ remove(path) {
1120
+ const pathArr = ensurePathArray2(path);
1121
+ throwIfEmpty5(pathArr, `Wrong path or path is empty: ${ensurePathString2(path)}, should contain at least one path segment`);
1122
+ if (this.isPathToRootFields(pathArr)) {
1123
+ this.rootFields.remove(pathArr);
1124
+ return;
1125
+ }
1126
+ const node = this.tree.findParentNode(pathArr);
1127
+ const leafName = pathArr[pathArr.length - 1];
1128
+ if (node instanceof CoreFields) {
1129
+ node.remove(leafName);
1130
+ } else if (node instanceof CoreFieldTree) {
1131
+ node.removeNode(leafName);
1132
+ }
1133
+ }
1134
+ isPathToRootFields(path) {
1135
+ return ensurePathArray2(path).length === 1;
1136
+ }
1137
+ getDestinationFields(path) {
1138
+ const pathArr = ensurePathArray2(path);
1139
+ if (this.isPathToRootFields(pathArr)) {
1140
+ return { fields: this.rootFields, leafName: pathArr[0] };
1141
+ }
1142
+ const leafName = pathArr.pop();
1143
+ return { fields: this.tree.getOrCreateFields(path), leafName };
1144
+ }
1145
+ };
1146
+
1147
+ // src/setup.ts
1148
+ function createCoreFieldRegistry() {
1149
+ const fieldRegistry = new FieldRegistry();
1150
+ fieldRegistry.register(CoreField.typeName, CoreField);
1151
+ fieldRegistry.register(CoreNumericField.typeName, CoreNumericField);
1152
+ fieldRegistry.register(CoreStringField.typeName, CoreStringField);
1153
+ fieldRegistry.register(CoreBooleanField.typeName, CoreBooleanField);
1154
+ return fieldRegistry;
1155
+ }
1156
+ function createCorePolicySerializer() {
1157
+ const policySerializer = new PolicySerializer();
1158
+ policySerializer.register(ClampPolicy.id, new ClampPolicySerializerHandler());
1159
+ policySerializer.register(ClampMinPolicy.id, new ClampMinPolicySerializerHandler());
1160
+ policySerializer.register(ClampMaxPolicy.id, new ClampMaxPolicySerializerHandler());
1161
+ return policySerializer;
1162
+ }
1163
+ function createCoreTreeNodeFactory(fieldRegistry) {
1164
+ return new CoreTreeNodeFactory(fieldRegistry);
1165
+ }
1166
+ function createCoreTreeSerializer(fieldTreeNodeFactory, policySerializer) {
1167
+ return new FieldTreeSerializer(
1168
+ fieldTreeNodeFactory,
1169
+ new FieldsSerializer(
1170
+ fieldTreeNodeFactory,
1171
+ new FieldSerializer(fieldTreeNodeFactory.fieldRegistry, policySerializer ?? createCorePolicySerializer())
1172
+ )
1173
+ );
1174
+ }
1175
+ function createCoreFieldSystem(config) {
1176
+ const registry = config?.registry ?? createCoreFieldRegistry();
1177
+ const factory = createCoreTreeNodeFactory(registry);
1178
+ const serializer = createCoreTreeSerializer(factory, config?.policySerializer);
1179
+ return { factory, serializer };
1180
+ }
971
1181
  export {
972
1182
  ClampMaxPolicy,
973
1183
  ClampMaxPolicySerializerHandler,
@@ -975,13 +1185,15 @@ export {
975
1185
  ClampMinPolicySerializerHandler,
976
1186
  ClampPolicy,
977
1187
  ClampPolicySerializerHandler,
978
- DefaultBooleanField,
979
- DefaultField,
980
- DefaultFields,
981
- DefaultFieldsFactory,
982
- DefaultNumericField,
983
- DefaultStringField,
984
- DefaultTreeNodeFactory,
1188
+ CoreBooleanField,
1189
+ CoreField,
1190
+ CoreFieldTree,
1191
+ CoreFields,
1192
+ CoreFieldsFactory,
1193
+ CoreNumericField,
1194
+ CoreStringField,
1195
+ CoreTreeNodeFactory,
1196
+ DataStore,
985
1197
  FieldRegistry,
986
1198
  FieldSerializer,
987
1199
  FieldTree,
@@ -993,5 +1205,10 @@ export {
993
1205
  clampMaxPolicy,
994
1206
  clampMinPolicy,
995
1207
  clampPolicy,
1208
+ createCoreFieldRegistry,
1209
+ createCoreFieldSystem,
1210
+ createCorePolicySerializer,
1211
+ createCoreTreeNodeFactory,
1212
+ createCoreTreeSerializer,
996
1213
  createTypedMethodsMixin
997
1214
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axi-engine/fields",
3
- "version": "0.2.3",
3
+ "version": "0.3.1",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -28,7 +28,12 @@
28
28
  "dist"
29
29
  ],
30
30
  "dependencies": {
31
- "@axi-engine/utils": "^0.1.6",
32
31
  "dequal": "^2.0.3"
32
+ },
33
+ "devDependencies": {
34
+ "@axi-engine/utils": "^0.1.6"
35
+ },
36
+ "peerDependencies": {
37
+ "@axi-engine/utils": "^0.1.6"
33
38
  }
34
39
  }