@axi-engine/fields 0.1.0 → 0.1.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.d.mts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { ReadonlySignal, Signal } from '@preact/signals-core';
2
- import { AxiEventEmitter } from '@axi-engine/events';
3
- import { PathType } from '@axi-engine/utils';
2
+ import EventEmitter3 from 'eventemitter3';
4
3
 
5
4
  declare const enum FieldsNodeType {
6
5
  fieldTree = "FieldTree",
@@ -132,6 +131,15 @@ declare class NumberField extends Field<number> {
132
131
  dec(amount?: number): void;
133
132
  }
134
133
 
134
+ /**
135
+ * This class is a wrapper around EventEmitter3, providing a stable,
136
+ *
137
+ * A high performance event emitter
138
+ * @see {@link https://github.com/primus/eventemitter3}
139
+ */
140
+ declare class AxiEventEmitter<T extends string | symbol> extends EventEmitter3<T> {
141
+ }
142
+
135
143
  /**
136
144
  * An abstract base class for managing a reactive collection of `Field` instances.
137
145
  *
@@ -218,6 +226,15 @@ declare class Fields extends BaseFields<any> {
218
226
  declare class TypedFields<T> extends BaseFields<T> {
219
227
  }
220
228
 
229
+ /**
230
+ * Represents a path that can be provided as a single string
231
+ * or an array of segments.
232
+ * @example
233
+ * 'player/stats/health'
234
+ * ['player', 'stats', 'health']
235
+ */
236
+ type PathType = string | string[];
237
+
221
238
  /** A type alias for any container that can be a child node in a FieldTree */
222
239
  type TreeOrFieldsContainer = FieldTree | Fields | TypedFields<any>;
223
240
  /** Describes the payload for events emitted when a container is created or removed from a FieldTree. */
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { ReadonlySignal, Signal } from '@preact/signals-core';
2
- import { AxiEventEmitter } from '@axi-engine/events';
3
- import { PathType } from '@axi-engine/utils';
2
+ import EventEmitter3 from 'eventemitter3';
4
3
 
5
4
  declare const enum FieldsNodeType {
6
5
  fieldTree = "FieldTree",
@@ -132,6 +131,15 @@ declare class NumberField extends Field<number> {
132
131
  dec(amount?: number): void;
133
132
  }
134
133
 
134
+ /**
135
+ * This class is a wrapper around EventEmitter3, providing a stable,
136
+ *
137
+ * A high performance event emitter
138
+ * @see {@link https://github.com/primus/eventemitter3}
139
+ */
140
+ declare class AxiEventEmitter<T extends string | symbol> extends EventEmitter3<T> {
141
+ }
142
+
135
143
  /**
136
144
  * An abstract base class for managing a reactive collection of `Field` instances.
137
145
  *
@@ -218,6 +226,15 @@ declare class Fields extends BaseFields<any> {
218
226
  declare class TypedFields<T> extends BaseFields<T> {
219
227
  }
220
228
 
229
+ /**
230
+ * Represents a path that can be provided as a single string
231
+ * or an array of segments.
232
+ * @example
233
+ * 'player/stats/health'
234
+ * ['player', 'stats', 'health']
235
+ */
236
+ type PathType = string | string[];
237
+
221
238
  /** A type alias for any container that can be a child node in a FieldTree */
222
239
  type TreeOrFieldsContainer = FieldTree | Fields | TypedFields<any>;
223
240
  /** Describes the payload for events emitted when a container is created or removed from a FieldTree. */
package/dist/index.js CHANGED
@@ -1,8 +1,13 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJS = (cb, mod) => function __require() {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ };
6
11
  var __export = (target, all) => {
7
12
  for (var name in all)
8
13
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -15,8 +20,178 @@ var __copyProps = (to, from, except, desc) => {
15
20
  }
16
21
  return to;
17
22
  };
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
+ // If the importer is in node compatibility mode or this is not an ESM
25
+ // file that has been converted to a CommonJS file using a Babel-
26
+ // compatible transform (i.e. "__esModule" has not been set), then set
27
+ // "default" to the CommonJS "module.exports" for node compatibility.
28
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29
+ mod
30
+ ));
18
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
32
 
33
+ // ../../node_modules/eventemitter3/index.js
34
+ var require_eventemitter3 = __commonJS({
35
+ "../../node_modules/eventemitter3/index.js"(exports2, module2) {
36
+ "use strict";
37
+ var has = Object.prototype.hasOwnProperty;
38
+ var prefix = "~";
39
+ function Events() {
40
+ }
41
+ if (Object.create) {
42
+ Events.prototype = /* @__PURE__ */ Object.create(null);
43
+ if (!new Events().__proto__) prefix = false;
44
+ }
45
+ function EE(fn, context, once) {
46
+ this.fn = fn;
47
+ this.context = context;
48
+ this.once = once || false;
49
+ }
50
+ function addListener(emitter, event, fn, context, once) {
51
+ if (typeof fn !== "function") {
52
+ throw new TypeError("The listener must be a function");
53
+ }
54
+ var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
55
+ if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
56
+ else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
57
+ else emitter._events[evt] = [emitter._events[evt], listener];
58
+ return emitter;
59
+ }
60
+ function clearEvent(emitter, evt) {
61
+ if (--emitter._eventsCount === 0) emitter._events = new Events();
62
+ else delete emitter._events[evt];
63
+ }
64
+ function EventEmitter2() {
65
+ this._events = new Events();
66
+ this._eventsCount = 0;
67
+ }
68
+ EventEmitter2.prototype.eventNames = function eventNames() {
69
+ var names = [], events, name;
70
+ if (this._eventsCount === 0) return names;
71
+ for (name in events = this._events) {
72
+ if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
73
+ }
74
+ if (Object.getOwnPropertySymbols) {
75
+ return names.concat(Object.getOwnPropertySymbols(events));
76
+ }
77
+ return names;
78
+ };
79
+ EventEmitter2.prototype.listeners = function listeners(event) {
80
+ var evt = prefix ? prefix + event : event, handlers = this._events[evt];
81
+ if (!handlers) return [];
82
+ if (handlers.fn) return [handlers.fn];
83
+ for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
84
+ ee[i] = handlers[i].fn;
85
+ }
86
+ return ee;
87
+ };
88
+ EventEmitter2.prototype.listenerCount = function listenerCount(event) {
89
+ var evt = prefix ? prefix + event : event, listeners = this._events[evt];
90
+ if (!listeners) return 0;
91
+ if (listeners.fn) return 1;
92
+ return listeners.length;
93
+ };
94
+ EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
95
+ var evt = prefix ? prefix + event : event;
96
+ if (!this._events[evt]) return false;
97
+ var listeners = this._events[evt], len = arguments.length, args, i;
98
+ if (listeners.fn) {
99
+ if (listeners.once) this.removeListener(event, listeners.fn, void 0, true);
100
+ switch (len) {
101
+ case 1:
102
+ return listeners.fn.call(listeners.context), true;
103
+ case 2:
104
+ return listeners.fn.call(listeners.context, a1), true;
105
+ case 3:
106
+ return listeners.fn.call(listeners.context, a1, a2), true;
107
+ case 4:
108
+ return listeners.fn.call(listeners.context, a1, a2, a3), true;
109
+ case 5:
110
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
111
+ case 6:
112
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
113
+ }
114
+ for (i = 1, args = new Array(len - 1); i < len; i++) {
115
+ args[i - 1] = arguments[i];
116
+ }
117
+ listeners.fn.apply(listeners.context, args);
118
+ } else {
119
+ var length = listeners.length, j;
120
+ for (i = 0; i < length; i++) {
121
+ if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true);
122
+ switch (len) {
123
+ case 1:
124
+ listeners[i].fn.call(listeners[i].context);
125
+ break;
126
+ case 2:
127
+ listeners[i].fn.call(listeners[i].context, a1);
128
+ break;
129
+ case 3:
130
+ listeners[i].fn.call(listeners[i].context, a1, a2);
131
+ break;
132
+ case 4:
133
+ listeners[i].fn.call(listeners[i].context, a1, a2, a3);
134
+ break;
135
+ default:
136
+ if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {
137
+ args[j - 1] = arguments[j];
138
+ }
139
+ listeners[i].fn.apply(listeners[i].context, args);
140
+ }
141
+ }
142
+ }
143
+ return true;
144
+ };
145
+ EventEmitter2.prototype.on = function on(event, fn, context) {
146
+ return addListener(this, event, fn, context, false);
147
+ };
148
+ EventEmitter2.prototype.once = function once(event, fn, context) {
149
+ return addListener(this, event, fn, context, true);
150
+ };
151
+ EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
152
+ var evt = prefix ? prefix + event : event;
153
+ if (!this._events[evt]) return this;
154
+ if (!fn) {
155
+ clearEvent(this, evt);
156
+ return this;
157
+ }
158
+ var listeners = this._events[evt];
159
+ if (listeners.fn) {
160
+ if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
161
+ clearEvent(this, evt);
162
+ }
163
+ } else {
164
+ for (var i = 0, events = [], length = listeners.length; i < length; i++) {
165
+ if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
166
+ events.push(listeners[i]);
167
+ }
168
+ }
169
+ if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
170
+ else clearEvent(this, evt);
171
+ }
172
+ return this;
173
+ };
174
+ EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {
175
+ var evt;
176
+ if (event) {
177
+ evt = prefix ? prefix + event : event;
178
+ if (this._events[evt]) clearEvent(this, evt);
179
+ } else {
180
+ this._events = new Events();
181
+ this._eventsCount = 0;
182
+ }
183
+ return this;
184
+ };
185
+ EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
186
+ EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;
187
+ EventEmitter2.prefixed = prefix;
188
+ EventEmitter2.EventEmitter = EventEmitter2;
189
+ if ("undefined" !== typeof module2) {
190
+ module2.exports = EventEmitter2;
191
+ }
192
+ }
193
+ });
194
+
20
195
  // src/index.ts
21
196
  var index_exports = {};
22
197
  __export(index_exports, {
@@ -197,8 +372,39 @@ var Field = class {
197
372
  }
198
373
  };
199
374
 
375
+ // ../utils/src/guards.ts
376
+ function isNullOrUndefined(val) {
377
+ return val === void 0 || val === null;
378
+ }
379
+
380
+ // ../utils/src/assertion.ts
381
+ function throwIf(conditionForThrow, exceptionMessage) {
382
+ if (conditionForThrow) {
383
+ throw new Error(exceptionMessage);
384
+ }
385
+ }
386
+ function throwIfEmpty(value, exceptionMessage) {
387
+ const isArrayAndEmpty = Array.isArray(value) && value.length === 0;
388
+ if (isNullOrUndefined(value) || isArrayAndEmpty) {
389
+ throw new Error(exceptionMessage);
390
+ }
391
+ }
392
+
393
+ // ../utils/src/config.ts
394
+ var defaultConfig = {
395
+ pathSeparator: "/"
396
+ };
397
+ var axiSettings = { ...defaultConfig };
398
+
399
+ // ../utils/src/path.ts
400
+ function ensurePathArray(path, separator = axiSettings.pathSeparator) {
401
+ return Array.isArray(path) ? [...path] : path.split(separator);
402
+ }
403
+ function ensurePathString(path, separator = axiSettings.pathSeparator) {
404
+ return !Array.isArray(path) ? path : path.join(separator);
405
+ }
406
+
200
407
  // src/number-field.ts
201
- var import_utils = require("@axi-engine/utils");
202
408
  var NumberField = class extends Field {
203
409
  get min() {
204
410
  const policy = this.getPolicy(ClampPolicy.id) ?? this.getPolicy(ClampMinPolicy.id);
@@ -210,19 +416,19 @@ var NumberField = class extends Field {
210
416
  }
211
417
  get isMin() {
212
418
  const min = this.min;
213
- return (0, import_utils.isNullOrUndefined)(min) ? false : this.val <= min;
419
+ return isNullOrUndefined(min) ? false : this.val <= min;
214
420
  }
215
421
  get isMax() {
216
422
  const max = this.max;
217
- return (0, import_utils.isNullOrUndefined)(max) ? false : this.val >= max;
423
+ return isNullOrUndefined(max) ? false : this.val >= max;
218
424
  }
219
425
  constructor(name, initialVal, options) {
220
426
  const policies = options?.policies ?? [];
221
- if (!(0, import_utils.isNullOrUndefined)(options?.min) && !(0, import_utils.isNullOrUndefined)(options?.max)) {
427
+ if (!isNullOrUndefined(options?.min) && !isNullOrUndefined(options?.max)) {
222
428
  policies.unshift(clampPolicy(options.min, options.max));
223
- } else if (!(0, import_utils.isNullOrUndefined)(options?.min)) {
429
+ } else if (!isNullOrUndefined(options?.min)) {
224
430
  policies.unshift(clampMinPolicy(options.min));
225
- } else if (!(0, import_utils.isNullOrUndefined)(options?.max)) {
431
+ } else if (!isNullOrUndefined(options?.max)) {
226
432
  policies.unshift(clampMaxPolicy(options.max));
227
433
  }
228
434
  super(name, initialVal, { policies });
@@ -237,12 +443,22 @@ var NumberField = class extends Field {
237
443
 
238
444
  // src/base-fields.ts
239
445
  var import_signals_core2 = require("@preact/signals-core");
240
- var import_events = require("@axi-engine/events");
241
- var import_utils2 = require("@axi-engine/utils");
446
+
447
+ // ../../node_modules/eventemitter3/index.mjs
448
+ var import_index = __toESM(require_eventemitter3(), 1);
449
+ var eventemitter3_default = import_index.default;
450
+
451
+ // ../events/src/event-emitter.ts
452
+ var AxiEventEmitter = class extends eventemitter3_default {
453
+ // Currently, we don't need to add any custom logic.
454
+ // The main purpose of this class is to create an abstraction layer.
455
+ };
456
+
457
+ // src/base-fields.ts
242
458
  var BaseFields = class {
243
459
  constructor() {
244
460
  this._fields = (0, import_signals_core2.signal)(/* @__PURE__ */ new Map());
245
- this.events = new import_events.AxiEventEmitter();
461
+ this.events = new AxiEventEmitter();
246
462
  }
247
463
  /**
248
464
  * A readonly signal providing access to the current map of fields.
@@ -276,7 +492,7 @@ var BaseFields = class {
276
492
  * @returns The added `Field` instance.
277
493
  */
278
494
  add(field) {
279
- (0, import_utils2.throwIf)(this.has(field.name), `Field with name '${field.name}' already exists`);
495
+ throwIf(this.has(field.name), `Field with name '${field.name}' already exists`);
280
496
  const fieldsMap = new Map(this._fields.value);
281
497
  fieldsMap.set(field.name, field);
282
498
  this._fields.value = fieldsMap;
@@ -293,7 +509,7 @@ var BaseFields = class {
293
509
  * @returns The `Field` instance.
294
510
  */
295
511
  get(name) {
296
- (0, import_utils2.throwIf)(!this._fields.value.has(name), `Field with name '${name}' not exists`);
512
+ throwIf(!this._fields.value.has(name), `Field with name '${name}' not exists`);
297
513
  return this._fields.value.get(name);
298
514
  }
299
515
  /**
@@ -366,7 +582,6 @@ var BaseFields = class {
366
582
  };
367
583
 
368
584
  // src/fields.ts
369
- var import_utils3 = require("@axi-engine/utils");
370
585
  var Fields = class extends BaseFields {
371
586
  createNumber(name, initialValue, options) {
372
587
  return this.add(new NumberField(name, initialValue, options));
@@ -381,7 +596,7 @@ var Fields = class extends BaseFields {
381
596
  }
382
597
  getNumber(name) {
383
598
  const field = this.get(name);
384
- (0, import_utils3.throwIf)(!(field instanceof NumberField), `wrong field type, field ${name} not a instance of NUmberField`);
599
+ throwIf(!(field instanceof NumberField), `wrong field type, field ${name} not a instance of NUmberField`);
385
600
  return field;
386
601
  }
387
602
  create(name, initialValue) {
@@ -396,7 +611,7 @@ var Fields = class extends BaseFields {
396
611
  return this.create(name, value);
397
612
  }
398
613
  get(name) {
399
- (0, import_utils3.throwIf)(!this._fields.value.has(name), `Field with name '${name}' not exists`);
614
+ throwIf(!this._fields.value.has(name), `Field with name '${name}' not exists`);
400
615
  return this._fields.value.get(name);
401
616
  }
402
617
  };
@@ -407,11 +622,9 @@ var TypedFields = class extends BaseFields {
407
622
 
408
623
  // src/field-tree.ts
409
624
  var import_signals_core3 = require("@preact/signals-core");
410
- var import_utils4 = require("@axi-engine/utils");
411
- var import_events2 = require("@axi-engine/events");
412
625
  var FieldTree = class _FieldTree {
413
626
  constructor() {
414
- this.events = new import_events2.AxiEventEmitter();
627
+ this.events = new AxiEventEmitter();
415
628
  this._items = (0, import_signals_core3.signal)(/* @__PURE__ */ new Map());
416
629
  }
417
630
  /**
@@ -426,7 +639,7 @@ var FieldTree = class _FieldTree {
426
639
  * @returns true if the entire path exists, false otherwise.
427
640
  */
428
641
  hasPath(path) {
429
- const pathParts = (0, import_utils4.ensurePathArray)(path);
642
+ const pathParts = ensurePathArray(path);
430
643
  let currentNode = this;
431
644
  for (let i = 0; i < pathParts.length; i++) {
432
645
  const part = pathParts[i];
@@ -438,9 +651,9 @@ var FieldTree = class _FieldTree {
438
651
  if (i === pathParts.length - 1) {
439
652
  return true;
440
653
  }
441
- (0, import_utils4.throwIf)(
654
+ throwIf(
442
655
  pathParts.length - i > 2,
443
- `Path validation failed, full path: ${(0, import_utils4.ensurePathString)(path)}, has extra nodes after Fields placed at: ${(0, import_utils4.ensurePathString)(pathParts.slice(0, i + 1))}`
656
+ `Path validation failed, full path: ${ensurePathString(path)}, has extra nodes after Fields placed at: ${ensurePathString(pathParts.slice(0, i + 1))}`
444
657
  );
445
658
  return nextNode.has(pathParts[i + 1]);
446
659
  }
@@ -456,7 +669,7 @@ var FieldTree = class _FieldTree {
456
669
  */
457
670
  getFieldTree(name) {
458
671
  const node = this.getNode(name);
459
- (0, import_utils4.throwIf)(!(node instanceof _FieldTree), `Node '${name}' should be instance of FieldTree`);
672
+ throwIf(!(node instanceof _FieldTree), `Node '${name}' should be instance of FieldTree`);
460
673
  return node;
461
674
  }
462
675
  /**
@@ -467,7 +680,7 @@ var FieldTree = class _FieldTree {
467
680
  */
468
681
  getFields(name) {
469
682
  const node = this.getNode(name);
470
- (0, import_utils4.throwIf)(!(node instanceof Fields), `Node '${name}' should be instance of Fields`);
683
+ throwIf(!(node instanceof Fields), `Node '${name}' should be instance of Fields`);
471
684
  return node;
472
685
  }
473
686
  /**
@@ -478,7 +691,7 @@ var FieldTree = class _FieldTree {
478
691
  */
479
692
  getTypedFields(name) {
480
693
  const node = this.getNode(name);
481
- (0, import_utils4.throwIf)(!(node instanceof TypedFields), `Node '${name}' should be instance of TypedFields`);
694
+ throwIf(!(node instanceof TypedFields), `Node '${name}' should be instance of TypedFields`);
482
695
  return node;
483
696
  }
484
697
  /**
@@ -489,7 +702,7 @@ var FieldTree = class _FieldTree {
489
702
  */
490
703
  getNode(name) {
491
704
  const node = this._items.value.get(name);
492
- (0, import_utils4.throwIfEmpty)(node, `Can't find node with name '${name}'`);
705
+ throwIfEmpty(node, `Can't find node with name '${name}'`);
493
706
  return node;
494
707
  }
495
708
  /**
@@ -523,8 +736,8 @@ var FieldTree = class _FieldTree {
523
736
  * @throws If the path is empty, or any intermediate node is not a `FieldTree`.
524
737
  */
525
738
  getFieldsByPath(path) {
526
- const pathParts = (0, import_utils4.ensurePathArray)(path);
527
- (0, import_utils4.throwIf)(!pathParts.length, "Empty path");
739
+ const pathParts = ensurePathArray(path);
740
+ throwIf(!pathParts.length, "Empty path");
528
741
  let container = this;
529
742
  for (let i = 0; i < pathParts.length - 1; i++) {
530
743
  container = container.getFieldTree(pathParts[i]);
@@ -539,9 +752,9 @@ var FieldTree = class _FieldTree {
539
752
  * @returns The newly created `Field` instance.
540
753
  */
541
754
  create(path, initialValue) {
542
- const fullPath = [...(0, import_utils4.ensurePathArray)(path)];
755
+ const fullPath = [...ensurePathArray(path)];
543
756
  const fieldName = fullPath.pop();
544
- (0, import_utils4.throwIf)(!fullPath.length, `Wrong path format of one field creating: '${(0, import_utils4.ensurePathString)(path)}', should be at least two sections`);
757
+ throwIf(!fullPath.length, `Wrong path format of one field creating: '${ensurePathString(path)}', should be at least two sections`);
545
758
  return this.getFieldsByPath(fullPath).create(fieldName, initialValue);
546
759
  }
547
760
  /**
@@ -551,7 +764,7 @@ var FieldTree = class _FieldTree {
551
764
  * @returns The newly created `NumberField` instance.
552
765
  */
553
766
  createNumber(path, initialValue) {
554
- const fullPath = [...(0, import_utils4.ensurePathArray)(path)];
767
+ const fullPath = [...ensurePathArray(path)];
555
768
  const fieldName = fullPath.pop();
556
769
  return this.getFieldsByPath(fullPath).createNumber(fieldName, initialValue);
557
770
  }
@@ -561,7 +774,7 @@ var FieldTree = class _FieldTree {
561
774
  * @returns The `Field` instance at the specified path.
562
775
  */
563
776
  get(path) {
564
- const fullPath = [...(0, import_utils4.ensurePathArray)(path)];
777
+ const fullPath = [...ensurePathArray(path)];
565
778
  const fieldName = fullPath.pop();
566
779
  return this.getFieldsByPath(fullPath).get(fieldName);
567
780
  }
@@ -571,7 +784,7 @@ var FieldTree = class _FieldTree {
571
784
  * @returns The `NumberField` instance at the specified path.
572
785
  */
573
786
  getNumber(path) {
574
- const fullPath = [...(0, import_utils4.ensurePathArray)(path)];
787
+ const fullPath = [...ensurePathArray(path)];
575
788
  const fieldName = fullPath.pop();
576
789
  return this.getFieldsByPath(fullPath).getNumber(fieldName);
577
790
  }
@@ -620,7 +833,7 @@ var FieldTree = class _FieldTree {
620
833
  */
621
834
  createNode(name, ctor) {
622
835
  const currentItems = this._items.value;
623
- (0, import_utils4.throwIf)(currentItems.has(name), `Can't create node with name: '${name}', node already exists`);
836
+ throwIf(currentItems.has(name), `Can't create node with name: '${name}', node already exists`);
624
837
  const res = new ctor();
625
838
  const newItems = new Map(currentItems);
626
839
  newItems.set(name, res);
package/dist/index.mjs CHANGED
@@ -1,3 +1,191 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __commonJS = (cb, mod) => function __require() {
8
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
+ // If the importer is in node compatibility mode or this is not an ESM
20
+ // file that has been converted to a CommonJS file using a Babel-
21
+ // compatible transform (i.e. "__esModule" has not been set), then set
22
+ // "default" to the CommonJS "module.exports" for node compatibility.
23
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
+ mod
25
+ ));
26
+
27
+ // ../../node_modules/eventemitter3/index.js
28
+ var require_eventemitter3 = __commonJS({
29
+ "../../node_modules/eventemitter3/index.js"(exports, module) {
30
+ "use strict";
31
+ var has = Object.prototype.hasOwnProperty;
32
+ var prefix = "~";
33
+ function Events() {
34
+ }
35
+ if (Object.create) {
36
+ Events.prototype = /* @__PURE__ */ Object.create(null);
37
+ if (!new Events().__proto__) prefix = false;
38
+ }
39
+ function EE(fn, context, once) {
40
+ this.fn = fn;
41
+ this.context = context;
42
+ this.once = once || false;
43
+ }
44
+ function addListener(emitter, event, fn, context, once) {
45
+ if (typeof fn !== "function") {
46
+ throw new TypeError("The listener must be a function");
47
+ }
48
+ var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
49
+ if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
50
+ else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
51
+ else emitter._events[evt] = [emitter._events[evt], listener];
52
+ return emitter;
53
+ }
54
+ function clearEvent(emitter, evt) {
55
+ if (--emitter._eventsCount === 0) emitter._events = new Events();
56
+ else delete emitter._events[evt];
57
+ }
58
+ function EventEmitter2() {
59
+ this._events = new Events();
60
+ this._eventsCount = 0;
61
+ }
62
+ EventEmitter2.prototype.eventNames = function eventNames() {
63
+ var names = [], events, name;
64
+ if (this._eventsCount === 0) return names;
65
+ for (name in events = this._events) {
66
+ if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
67
+ }
68
+ if (Object.getOwnPropertySymbols) {
69
+ return names.concat(Object.getOwnPropertySymbols(events));
70
+ }
71
+ return names;
72
+ };
73
+ EventEmitter2.prototype.listeners = function listeners(event) {
74
+ var evt = prefix ? prefix + event : event, handlers = this._events[evt];
75
+ if (!handlers) return [];
76
+ if (handlers.fn) return [handlers.fn];
77
+ for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
78
+ ee[i] = handlers[i].fn;
79
+ }
80
+ return ee;
81
+ };
82
+ EventEmitter2.prototype.listenerCount = function listenerCount(event) {
83
+ var evt = prefix ? prefix + event : event, listeners = this._events[evt];
84
+ if (!listeners) return 0;
85
+ if (listeners.fn) return 1;
86
+ return listeners.length;
87
+ };
88
+ EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
89
+ var evt = prefix ? prefix + event : event;
90
+ if (!this._events[evt]) return false;
91
+ var listeners = this._events[evt], len = arguments.length, args, i;
92
+ if (listeners.fn) {
93
+ if (listeners.once) this.removeListener(event, listeners.fn, void 0, true);
94
+ switch (len) {
95
+ case 1:
96
+ return listeners.fn.call(listeners.context), true;
97
+ case 2:
98
+ return listeners.fn.call(listeners.context, a1), true;
99
+ case 3:
100
+ return listeners.fn.call(listeners.context, a1, a2), true;
101
+ case 4:
102
+ return listeners.fn.call(listeners.context, a1, a2, a3), true;
103
+ case 5:
104
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
105
+ case 6:
106
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
107
+ }
108
+ for (i = 1, args = new Array(len - 1); i < len; i++) {
109
+ args[i - 1] = arguments[i];
110
+ }
111
+ listeners.fn.apply(listeners.context, args);
112
+ } else {
113
+ var length = listeners.length, j;
114
+ for (i = 0; i < length; i++) {
115
+ if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true);
116
+ switch (len) {
117
+ case 1:
118
+ listeners[i].fn.call(listeners[i].context);
119
+ break;
120
+ case 2:
121
+ listeners[i].fn.call(listeners[i].context, a1);
122
+ break;
123
+ case 3:
124
+ listeners[i].fn.call(listeners[i].context, a1, a2);
125
+ break;
126
+ case 4:
127
+ listeners[i].fn.call(listeners[i].context, a1, a2, a3);
128
+ break;
129
+ default:
130
+ if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {
131
+ args[j - 1] = arguments[j];
132
+ }
133
+ listeners[i].fn.apply(listeners[i].context, args);
134
+ }
135
+ }
136
+ }
137
+ return true;
138
+ };
139
+ EventEmitter2.prototype.on = function on(event, fn, context) {
140
+ return addListener(this, event, fn, context, false);
141
+ };
142
+ EventEmitter2.prototype.once = function once(event, fn, context) {
143
+ return addListener(this, event, fn, context, true);
144
+ };
145
+ EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
146
+ var evt = prefix ? prefix + event : event;
147
+ if (!this._events[evt]) return this;
148
+ if (!fn) {
149
+ clearEvent(this, evt);
150
+ return this;
151
+ }
152
+ var listeners = this._events[evt];
153
+ if (listeners.fn) {
154
+ if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
155
+ clearEvent(this, evt);
156
+ }
157
+ } else {
158
+ for (var i = 0, events = [], length = listeners.length; i < length; i++) {
159
+ if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
160
+ events.push(listeners[i]);
161
+ }
162
+ }
163
+ if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
164
+ else clearEvent(this, evt);
165
+ }
166
+ return this;
167
+ };
168
+ EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {
169
+ var evt;
170
+ if (event) {
171
+ evt = prefix ? prefix + event : event;
172
+ if (this._events[evt]) clearEvent(this, evt);
173
+ } else {
174
+ this._events = new Events();
175
+ this._eventsCount = 0;
176
+ }
177
+ return this;
178
+ };
179
+ EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
180
+ EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;
181
+ EventEmitter2.prefixed = prefix;
182
+ EventEmitter2.EventEmitter = EventEmitter2;
183
+ if ("undefined" !== typeof module) {
184
+ module.exports = EventEmitter2;
185
+ }
186
+ }
187
+ });
188
+
1
189
  // src/fields-types.ts
2
190
  var FieldsNodeType = /* @__PURE__ */ ((FieldsNodeType2) => {
3
191
  FieldsNodeType2["fieldTree"] = "FieldTree";
@@ -159,8 +347,39 @@ var Field = class {
159
347
  }
160
348
  };
161
349
 
350
+ // ../utils/src/guards.ts
351
+ function isNullOrUndefined(val) {
352
+ return val === void 0 || val === null;
353
+ }
354
+
355
+ // ../utils/src/assertion.ts
356
+ function throwIf(conditionForThrow, exceptionMessage) {
357
+ if (conditionForThrow) {
358
+ throw new Error(exceptionMessage);
359
+ }
360
+ }
361
+ function throwIfEmpty(value, exceptionMessage) {
362
+ const isArrayAndEmpty = Array.isArray(value) && value.length === 0;
363
+ if (isNullOrUndefined(value) || isArrayAndEmpty) {
364
+ throw new Error(exceptionMessage);
365
+ }
366
+ }
367
+
368
+ // ../utils/src/config.ts
369
+ var defaultConfig = {
370
+ pathSeparator: "/"
371
+ };
372
+ var axiSettings = { ...defaultConfig };
373
+
374
+ // ../utils/src/path.ts
375
+ function ensurePathArray(path, separator = axiSettings.pathSeparator) {
376
+ return Array.isArray(path) ? [...path] : path.split(separator);
377
+ }
378
+ function ensurePathString(path, separator = axiSettings.pathSeparator) {
379
+ return !Array.isArray(path) ? path : path.join(separator);
380
+ }
381
+
162
382
  // src/number-field.ts
163
- import { isNullOrUndefined } from "@axi-engine/utils";
164
383
  var NumberField = class extends Field {
165
384
  get min() {
166
385
  const policy = this.getPolicy(ClampPolicy.id) ?? this.getPolicy(ClampMinPolicy.id);
@@ -199,8 +418,18 @@ var NumberField = class extends Field {
199
418
 
200
419
  // src/base-fields.ts
201
420
  import { signal as signal2 } from "@preact/signals-core";
202
- import { AxiEventEmitter } from "@axi-engine/events";
203
- import { throwIf } from "@axi-engine/utils";
421
+
422
+ // ../../node_modules/eventemitter3/index.mjs
423
+ var import_index = __toESM(require_eventemitter3(), 1);
424
+ var eventemitter3_default = import_index.default;
425
+
426
+ // ../events/src/event-emitter.ts
427
+ var AxiEventEmitter = class extends eventemitter3_default {
428
+ // Currently, we don't need to add any custom logic.
429
+ // The main purpose of this class is to create an abstraction layer.
430
+ };
431
+
432
+ // src/base-fields.ts
204
433
  var BaseFields = class {
205
434
  constructor() {
206
435
  this._fields = signal2(/* @__PURE__ */ new Map());
@@ -328,7 +557,6 @@ var BaseFields = class {
328
557
  };
329
558
 
330
559
  // src/fields.ts
331
- import { throwIf as throwIf2 } from "@axi-engine/utils";
332
560
  var Fields = class extends BaseFields {
333
561
  createNumber(name, initialValue, options) {
334
562
  return this.add(new NumberField(name, initialValue, options));
@@ -343,7 +571,7 @@ var Fields = class extends BaseFields {
343
571
  }
344
572
  getNumber(name) {
345
573
  const field = this.get(name);
346
- throwIf2(!(field instanceof NumberField), `wrong field type, field ${name} not a instance of NUmberField`);
574
+ throwIf(!(field instanceof NumberField), `wrong field type, field ${name} not a instance of NUmberField`);
347
575
  return field;
348
576
  }
349
577
  create(name, initialValue) {
@@ -358,7 +586,7 @@ var Fields = class extends BaseFields {
358
586
  return this.create(name, value);
359
587
  }
360
588
  get(name) {
361
- throwIf2(!this._fields.value.has(name), `Field with name '${name}' not exists`);
589
+ throwIf(!this._fields.value.has(name), `Field with name '${name}' not exists`);
362
590
  return this._fields.value.get(name);
363
591
  }
364
592
  };
@@ -369,11 +597,9 @@ var TypedFields = class extends BaseFields {
369
597
 
370
598
  // src/field-tree.ts
371
599
  import { signal as signal3 } from "@preact/signals-core";
372
- import { ensurePathArray, ensurePathString, throwIf as throwIf3, throwIfEmpty } from "@axi-engine/utils";
373
- import { AxiEventEmitter as AxiEventEmitter2 } from "@axi-engine/events";
374
600
  var FieldTree = class _FieldTree {
375
601
  constructor() {
376
- this.events = new AxiEventEmitter2();
602
+ this.events = new AxiEventEmitter();
377
603
  this._items = signal3(/* @__PURE__ */ new Map());
378
604
  }
379
605
  /**
@@ -400,7 +626,7 @@ var FieldTree = class _FieldTree {
400
626
  if (i === pathParts.length - 1) {
401
627
  return true;
402
628
  }
403
- throwIf3(
629
+ throwIf(
404
630
  pathParts.length - i > 2,
405
631
  `Path validation failed, full path: ${ensurePathString(path)}, has extra nodes after Fields placed at: ${ensurePathString(pathParts.slice(0, i + 1))}`
406
632
  );
@@ -418,7 +644,7 @@ var FieldTree = class _FieldTree {
418
644
  */
419
645
  getFieldTree(name) {
420
646
  const node = this.getNode(name);
421
- throwIf3(!(node instanceof _FieldTree), `Node '${name}' should be instance of FieldTree`);
647
+ throwIf(!(node instanceof _FieldTree), `Node '${name}' should be instance of FieldTree`);
422
648
  return node;
423
649
  }
424
650
  /**
@@ -429,7 +655,7 @@ var FieldTree = class _FieldTree {
429
655
  */
430
656
  getFields(name) {
431
657
  const node = this.getNode(name);
432
- throwIf3(!(node instanceof Fields), `Node '${name}' should be instance of Fields`);
658
+ throwIf(!(node instanceof Fields), `Node '${name}' should be instance of Fields`);
433
659
  return node;
434
660
  }
435
661
  /**
@@ -440,7 +666,7 @@ var FieldTree = class _FieldTree {
440
666
  */
441
667
  getTypedFields(name) {
442
668
  const node = this.getNode(name);
443
- throwIf3(!(node instanceof TypedFields), `Node '${name}' should be instance of TypedFields`);
669
+ throwIf(!(node instanceof TypedFields), `Node '${name}' should be instance of TypedFields`);
444
670
  return node;
445
671
  }
446
672
  /**
@@ -486,7 +712,7 @@ var FieldTree = class _FieldTree {
486
712
  */
487
713
  getFieldsByPath(path) {
488
714
  const pathParts = ensurePathArray(path);
489
- throwIf3(!pathParts.length, "Empty path");
715
+ throwIf(!pathParts.length, "Empty path");
490
716
  let container = this;
491
717
  for (let i = 0; i < pathParts.length - 1; i++) {
492
718
  container = container.getFieldTree(pathParts[i]);
@@ -503,7 +729,7 @@ var FieldTree = class _FieldTree {
503
729
  create(path, initialValue) {
504
730
  const fullPath = [...ensurePathArray(path)];
505
731
  const fieldName = fullPath.pop();
506
- throwIf3(!fullPath.length, `Wrong path format of one field creating: '${ensurePathString(path)}', should be at least two sections`);
732
+ throwIf(!fullPath.length, `Wrong path format of one field creating: '${ensurePathString(path)}', should be at least two sections`);
507
733
  return this.getFieldsByPath(fullPath).create(fieldName, initialValue);
508
734
  }
509
735
  /**
@@ -582,7 +808,7 @@ var FieldTree = class _FieldTree {
582
808
  */
583
809
  createNode(name, ctor) {
584
810
  const currentItems = this._items.value;
585
- throwIf3(currentItems.has(name), `Can't create node with name: '${name}', node already exists`);
811
+ throwIf(currentItems.has(name), `Can't create node with name: '${name}', node already exists`);
586
812
  const res = new ctor();
587
813
  const newItems = new Map(currentItems);
588
814
  newItems.set(name, res);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axi-engine/fields",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -28,7 +28,9 @@
28
28
  "dist"
29
29
  ],
30
30
  "dependencies": {
31
- "@preact/signals-core": "^1.12.1",
31
+ "@preact/signals-core": "^1.12.1"
32
+ },
33
+ "devDependencies": {
32
34
  "@axi-engine/events": "*",
33
35
  "@axi-engine/utils": "*"
34
36
  }