@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 +19 -2
- package/dist/index.d.ts +19 -2
- package/dist/index.js +245 -32
- package/dist/index.mjs +242 -16
- package/package.json +4 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ReadonlySignal, Signal } from '@preact/signals-core';
|
|
2
|
-
import
|
|
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
|
|
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
|
|
419
|
+
return isNullOrUndefined(min) ? false : this.val <= min;
|
|
214
420
|
}
|
|
215
421
|
get isMax() {
|
|
216
422
|
const max = this.max;
|
|
217
|
-
return
|
|
423
|
+
return isNullOrUndefined(max) ? false : this.val >= max;
|
|
218
424
|
}
|
|
219
425
|
constructor(name, initialVal, options) {
|
|
220
426
|
const policies = options?.policies ?? [];
|
|
221
|
-
if (!
|
|
427
|
+
if (!isNullOrUndefined(options?.min) && !isNullOrUndefined(options?.max)) {
|
|
222
428
|
policies.unshift(clampPolicy(options.min, options.max));
|
|
223
|
-
} else if (!
|
|
429
|
+
} else if (!isNullOrUndefined(options?.min)) {
|
|
224
430
|
policies.unshift(clampMinPolicy(options.min));
|
|
225
|
-
} else if (!
|
|
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
|
-
|
|
241
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
654
|
+
throwIf(
|
|
442
655
|
pathParts.length - i > 2,
|
|
443
|
-
`Path validation failed, full path: ${
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
527
|
-
|
|
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 = [...
|
|
755
|
+
const fullPath = [...ensurePathArray(path)];
|
|
543
756
|
const fieldName = fullPath.pop();
|
|
544
|
-
|
|
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 = [...
|
|
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 = [...
|
|
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 = [...
|
|
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
|
-
|
|
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
|
-
|
|
203
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
}
|