@ygracs/xobj-lib-js 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/xObj-lib.js CHANGED
@@ -1,1363 +1,1562 @@
1
- // [v0.1.063-20240624]
2
-
3
- // === module init block ===
4
-
5
- const {
6
- valueToIndex, valueToIDString,
7
- readAsString, readAsBoolEx, readAsNumberEx,
8
- isNullOrUndef,
9
- isInteger,
10
- isArray, isObject, isPlainObject,
11
- readAsListS,
12
- } = require('@ygracs/bsfoc-lib-js');
13
-
14
- // === module extra block (helper functions) ===
15
-
16
- // === module main block ===
17
-
18
- /***
19
- * (* constant definitions *)
20
- */
21
-
22
- const XOBJ_DEF_PARAM_TNAME = '__text';
23
- const XOBJ_DEF_ATTR_TNAME = '__attr';
24
-
25
- const XOBJ_TE_INVARG_EMSG = 'invalid argument';
26
- const XOBJ_TE_NOBJ_EMSG = `${XOBJ_TE_INVARG_EMSG} (an object expected)`;
27
- const XOBJ_TE_NOBJ_ECODE = 'ERR_XOBJ_NOBJ';
28
- const XOBJ_TE_NARR_EMSG = `${XOBJ_TE_INVARG_EMSG} (an array expected)`;
29
- const XOBJ_TE_NARR_ECODE = 'ERR_XOBJ_NARR';
30
- const XOBJ_TE_NSTR_EMSG = `${XOBJ_TE_INVARG_EMSG} (a string expected)`;
31
- const XOBJ_TE_NSTR_ECODE = 'ERR_XOBJ_NSTR';
32
- const XOBJ_TE_NPOBJ_EMSG = `${XOBJ_TE_INVARG_EMSG} (a plain object expected)`;
33
- const XOBJ_TE_NPOBJ_ECODE = 'ERR_XOBJ_NPOBJ';
34
- const XOBJ_TE_ANES_EMSG = '<attr_name> must be a non-empty string';
35
- const XOBJ_TE_ANES_ECODE = 'ERR_XOBJ_INVARG_ATTR';
36
- const XOBJ_TE_KNES_EMSG = '<key_name> must be a non-empty string';
37
- const XOBJ_TE_KNES_ECODE = 'ERR_XOBJ_INVARG_KEY';
38
-
39
- /***
40
- * (* function definitions *)
41
- */
42
-
43
- function evalXObjEName(value){
44
- //return valueToIDString(value); // // TODO: [?]
45
- let name = value;
46
- switch (typeof name) {
47
- case 'number' : {
48
- if (valueToIndex(name) === -1) name = null;
49
- break;
50
- }
51
- case 'string' : {
52
- name = name.trim();
53
- if (name !== '') {
54
- let value = Number(name);
55
- if (!Number.isNaN(value)) {
56
- name = (
57
- value < 0 || !isInteger(value)
58
- ? null
59
- : value
60
- );
61
- };
62
- } else {
63
- name = null;
64
- };
65
- break;
66
- }
67
- default: {
68
- name = null;
69
- }
70
- };
71
- return name;
72
- };
73
-
74
- function genXObjENameDescr(value){
75
- let result = null;
76
- let name = null;
77
- let conditions = null;
78
- let isERR = false;
79
- let tail = null;
80
- if (typeof value === 'string') {
81
- const re = /^\s*([^\[\]\s]+)?(\s*)(\[.*])?\s*$/;
82
- tail = value.match(re);
83
- //console.log('CHECK: '+JSON.stringify(tail, null, 2));
84
- if (tail) {
85
- if (tail[1]) {
86
- name = tail[1];
87
- if (name) {
88
- if (tail[2] === '') {
89
- if (tail[3]) {
90
- const re = /\[(@{0,1})(?:([^\[=]*?)(?:(?=[=])(=)((?![\"\'])[^\]]*|(?=([\"\']))\5(.*)\5))?)](\s*.*)/;
91
- tail = tail[3].match(re);
92
- //console.log('CHECK: '+JSON.stringify(tail, null, 2));
93
- if (tail) {
94
- let name = evalXObjEName(tail[2]);
95
- let type = tail[1] === '@' ? 'attribute' : 'child';
96
- let value = undefined;
97
- if (tail[3] === '=') value = tail[5] ? tail[6] : tail[4];
98
- if (tail[7]) isERR = true;
99
- conditions = {
100
- name,
101
- type,
102
- value,
103
- };
104
- };
105
- };
106
- } else if (tail[3]) {
107
- name = null;
108
- };
109
- };
110
- };
111
- };
112
- } else {
113
- name = value;
114
- };
115
- name = evalXObjEName(name);
116
- if (name === null) isERR = true;
117
- result = {
118
- name,
119
- conditions,
120
- isERR,
121
- };
122
- return result;
123
- };
124
-
125
- /**
126
- * @function getXObjElement
127
- * @param {object}
128
- * @param {ID_STRING}
129
- * @returns {?object}
130
- * @throws {TypeError}
131
- * @description Extracts an element from a given object by its key.
132
- */
133
- function getXObjElement(obj, name){
134
- let err = null;
135
- if (!isPlainObject(obj)) {
136
- err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
137
- err.code = XOBJ_TE_NPOBJ_ECODE;
138
- throw err;
139
- };
140
- if (typeof name !== 'string') {
141
- err = new TypeError(XOBJ_TE_NSTR_EMSG);
142
- err.code = XOBJ_TE_NSTR_ECODE;
143
- throw err;
144
- };
145
- const key = name.trim();
146
- if (key === '') {
147
- err = new TypeError(XOBJ_TE_KNES_EMSG);
148
- err.code = XOBJ_TE_KNES_ECODE;
149
- throw err;
150
- };
151
- // TODO: [?] check type of obj[key_name]
152
- return obj[key] !== undefined ? obj[key] : null;
153
- };
154
-
155
- /**
156
- * @function getXObjAttributes
157
- * @param {object}
158
- * @param {ID_STRING} [key]
159
- * @returns {?object}
160
- * @throws {TypeError}
161
- * @description Extracts an attributes from a given object by its key.
162
- */
163
- function getXObjAttributes(obj, key = XOBJ_DEF_ATTR_TNAME){
164
- let result = null;
165
- try {
166
- result = getXObjElement(obj, key);
167
- } catch (err) {
168
- switch (err.code) {
169
- case XOBJ_TE_NSTR_ECODE :
170
- case XOBJ_TE_KNES_ECODE : {
171
- break;
172
- }
173
- default: {
174
- throw err;
175
- break;
176
- }
177
- };
178
- };
179
- return isPlainObject(result) ? result : null;
180
- };
181
-
182
- /**
183
- * @function addXObjElement
184
- * @param {object}
185
- * @param {ID_STRING}
186
- * @returns {?object}
187
- * @throws {TypeError}
188
- * @description Adds an element addressed by its key to a given object.
189
- */
190
- function addXObjElement(obj, name){
191
- let err = null;
192
- if (!isPlainObject(obj)) {
193
- err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
194
- err.code = XOBJ_TE_NPOBJ_ECODE;
195
- throw err;
196
- };
197
- if (typeof name !== 'string') {
198
- err = new TypeError(XOBJ_TE_NSTR_EMSG);
199
- err.code = XOBJ_TE_NSTR_ECODE;
200
- throw err;
201
- };
202
- const key = name.trim();
203
- if (key === '') {
204
- err = new TypeError(XOBJ_TE_KNES_EMSG);
205
- err.code = XOBJ_TE_KNES_ECODE;
206
- throw err;
207
- };
208
- const item = {};
209
- let prop = obj[key];
210
- let isSUCCEED = false;
211
- // // TODO: [?] consider wheter or not do ops if new_key exists
212
- if (isNullOrUndef(prop)) {
213
- obj[key] = prop = item;
214
- isSUCCEED = true;
215
- } else if (isObject(prop)) {
216
- if (isArray(prop)) {
217
- prop.push(item);
218
- } else {
219
- obj[key] = [ prop, item ];
220
- };
221
- prop = item;
222
- isSUCCEED = true;
223
- };
224
- return {
225
- isSucceed: isSUCCEED,
226
- item: isSUCCEED ? prop : null,
227
- };
228
- };
229
-
230
- /**
231
- * @function insertXObjElement
232
- * @param {object}
233
- * @param {ID_STRING}
234
- * @param {object} [opt]
235
- * @param {bool} [opt.force=false]
236
- * @param {bool} [opt.ripOldies=false]
237
- * @returns {?object}
238
- * @throws {TypeError}
239
- * @description Inserts an element addressed by its key into a given object.
240
- */
241
- function insertXObjElement(obj, name, opt){
242
- let err = null;
243
- if (!isPlainObject(obj)) {
244
- err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
245
- err.code = XOBJ_TE_NPOBJ_ECODE;
246
- throw err;
247
- };
248
- if (typeof name !== 'string') {
249
- err = new TypeError(XOBJ_TE_NSTR_EMSG);
250
- err.code = XOBJ_TE_NSTR_ECODE;
251
- throw err;
252
- };
253
- const key = name.trim();
254
- if (key === '') {
255
- err = new TypeError(XOBJ_TE_KNES_EMSG);
256
- err.code = XOBJ_TE_KNES_ECODE;
257
- throw err;
258
- };
259
- const _options = isPlainObject(opt) ? opt : {};
260
- let { force, ripOldies } = _options;
261
- if (typeof force !== 'boolean') force = false;
262
- if (typeof ripOldies !== 'boolean') ripOldies = false;
263
- let prop = obj[key];
264
- let isACCEPTED = (
265
- isNullOrUndef(prop)
266
- || (force && (ripOldies || !isPlainObject(prop)))
267
- );
268
- if (isACCEPTED) {
269
- obj[key] = prop = {};
270
- } else {
271
- isACCEPTED = isPlainObject(prop);
272
- };
273
- return isACCEPTED ? prop : null;
274
- };
275
-
276
- /**
277
- * @function deleteXObjElement
278
- * @param {object}
279
- * @param {ID_STRING}
280
- * @returns {bool}
281
- * @throws {TypeError}
282
- * @description Deletes an element addressed by its key from a given object.
283
- */
284
- function deleteXObjElement(obj, name){
285
- let err = null;
286
- if (!isPlainObject(obj)) {
287
- err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
288
- err.code = XOBJ_TE_NPOBJ_ECODE;
289
- throw err;
290
- };
291
- if (typeof name !== 'string') {
292
- err = new TypeError(XOBJ_TE_NSTR_EMSG);
293
- err.code = XOBJ_TE_NSTR_ECODE;
294
- throw err;
295
- };
296
- const key = name.trim();
297
- if (key === '') {
298
- err = new TypeError(XOBJ_TE_KNES_EMSG);
299
- err.code = XOBJ_TE_KNES_ECODE;
300
- throw err;
301
- };
302
- let result = false;
303
- // // TODO: catch errors in strict mode
304
- result = delete obj[key];
305
- return result;
306
- };
307
-
308
- /**
309
- * @function deleteXObjElementEx
310
- * @param {object}
311
- * @param {ID_STRING}
312
- * @returns {object}
313
- * @throws {TypeError}
314
- * @description Deletes an element addressed by its key from a given object.
315
- */
316
- function deleteXObjElementEx(obj, name){
317
- let err = null;
318
- if (!isPlainObject(obj)) {
319
- err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
320
- err.code = XOBJ_TE_NPOBJ_ECODE;
321
- throw err;
322
- };
323
- if (typeof name !== 'string') {
324
- err = new TypeError(XOBJ_TE_NSTR_EMSG);
325
- err.code = XOBJ_TE_NSTR_ECODE;
326
- throw err;
327
- };
328
- const key = name.trim();
329
- if (key === '') {
330
- err = new TypeError(XOBJ_TE_KNES_EMSG);
331
- err.code = XOBJ_TE_KNES_ECODE;
332
- throw err;
333
- };
334
- let prop = obj[key];
335
- let result = false;
336
- // // TODO: catch errors in strict mode
337
- result = delete obj[key];
338
- return {
339
- isSucceed: result,
340
- item: result && isObject(prop) ? prop : null,
341
- };
342
- };
343
-
344
- /**
345
- * @function renameXObjElement
346
- * @param {object}
347
- * @param {ID_STRING} - old key
348
- * @param {ID_STRING} - new key
349
- * @returns {bool}
350
- * @throws {TypeError}
351
- * @description Renames an element addressed by its key.
352
- */
353
- function renameXObjElement(obj, name, newName){
354
- let err = null;
355
- if (!isPlainObject(obj)) {
356
- err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
357
- err.code = XOBJ_TE_NPOBJ_ECODE;
358
- throw err;
359
- };
360
- if (typeof name !== 'string' || typeof newName !== 'string') {
361
- err = new TypeError(XOBJ_TE_NSTR_EMSG);
362
- err.code = XOBJ_TE_NSTR_ECODE;
363
- throw err;
364
- };
365
- const key = name.trim();
366
- const newKey = newName.trim();
367
- if (key === '' || newKey === '') {
368
- err = new TypeError(XOBJ_TE_KNES_EMSG);
369
- err.code = XOBJ_TE_KNES_ECODE;
370
- throw err;
371
- };
372
- const prop = obj[key];
373
- let result = false;
374
- if (prop !== undefined) {
375
- if (key === newKey) return isObject(prop);
376
- // // TODO: consider wheter or not do ops if new_key exists
377
- // // TODO: catch errors in strict mode
378
- result = delete obj[key];
379
- if (result) {
380
- obj[newKey] = isObject(prop) ? prop : {};
381
- };
382
- };
383
- return result;
384
- };
385
-
386
- /**
387
- * @function checkXObjAttribute
388
- * @param {object}
389
- * @param {ID_STRING}
390
- * @param {ID_STRING} [key]
391
- * @returns {bool}
392
- * @throws {TypeError}
393
- * @description Checks wheter an attribute is exists.
394
- */
395
- function checkXObjAttribute(obj, attr = '', key){
396
- if (typeof attr !== 'string') {
397
- let err = new TypeError(XOBJ_TE_NSTR_EMSG);
398
- err.code = XOBJ_TE_NSTR_ECODE;
399
- throw err;
400
- };
401
- let objAttr = null;
402
- try {
403
- objAttr = getXObjAttributes(obj, key);
404
- } catch (err) {
405
- throw err;
406
- };
407
- const attrName = attr.trim();
408
- let result = false;
409
- if (
410
- objAttr !== null
411
- && attrName !== ''
412
- && objAttr[attrName] !== undefined
413
- ) {
414
- result = true;
415
- };
416
- return result;
417
- };
418
-
419
- /**
420
- * @function deleteXObjAttribute
421
- * @param {object}
422
- * @param {ID_STRING}
423
- * @param {ID_STRING} [key]
424
- * @returns {bool}
425
- * @throws {TypeError}
426
- * @description Deletes an attribute addressed by a given key.
427
- */
428
- function deleteXObjAttribute(obj, attr = '', key){
429
- if (typeof attr !== 'string') {
430
- let err = new TypeError(XOBJ_TE_NSTR_EMSG);
431
- err.code = XOBJ_TE_NSTR_ECODE;
432
- throw err;
433
- };
434
- let objAttr = null;
435
- try {
436
- objAttr = getXObjAttributes(obj, key);
437
- } catch (err) {
438
- throw err;
439
- };
440
- const attrName = attr.trim();
441
- let result = false;
442
- if (objAttr !== null && attrName !== '') {
443
- // // TODO: catch errors in strict mode
444
- result = delete objAttr[attrName];
445
- };
446
- return result;
447
- };
448
-
449
- /**
450
- * @function readXObjParamRaw
451
- * @param {object}
452
- * @param {ID_STRING} [key]
453
- * @returns {any}
454
- * @throws {TypeError}
455
- * @description Extracts a parameter from a given object.
456
- */
457
- function readXObjParamRaw(obj, key = XOBJ_DEF_PARAM_TNAME){
458
- let err = null;
459
- if (!isPlainObject(obj)) {
460
- err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
461
- err.code = XOBJ_TE_NPOBJ_ECODE;
462
- throw err;
463
- };
464
- if (typeof key !== 'string') {
465
- err = new TypeError(XOBJ_TE_NSTR_EMSG);
466
- err.code = XOBJ_TE_NSTR_ECODE;
467
- throw err;
468
- };
469
- const _key = key.trim();
470
- return _key !== '' ? obj[_key] : undefined;
471
- };
472
-
473
- /**
474
- * @function writeXObjParamRaw
475
- * @param {object}
476
- * @param {any}
477
- * @param {ID_STRING} [key]
478
- * @returns {bool}
479
- * @throws {TypeError}
480
- * @description Writes a parameter into a given object.
481
- */
482
- function writeXObjParamRaw(obj, value, key = XOBJ_DEF_PARAM_TNAME){
483
- let err = null;
484
- if (!isPlainObject(obj)) {
485
- err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
486
- err.code = XOBJ_TE_NPOBJ_ECODE;
487
- throw err;
488
- };
489
- if (typeof key !== 'string') {
490
- err = new TypeError(XOBJ_TE_NSTR_EMSG);
491
- err.code = XOBJ_TE_NSTR_ECODE;
492
- throw err;
493
- };
494
- const _key = key.trim();
495
- let isSUCCEED = false;
496
- if (_key !== '' && value !== undefined){
497
- obj[_key] = value;
498
- isSUCCEED = true;
499
- };
500
- return isSUCCEED;
501
- };
502
-
503
- /**
504
- * @function readXObjAttrRaw
505
- * @param {object}
506
- * @param {ID_STRING}
507
- * @param {ID_STRING} [key]
508
- * @returns {any}
509
- * @throws {TypeError}
510
- * @description Extracts an attribute from a given object.
511
- */
512
- function readXObjAttrRaw(obj, attr = '', key){
513
- if (typeof attr !== 'string') {
514
- let err = new TypeError(XOBJ_TE_NSTR_EMSG);
515
- err.code = XOBJ_TE_NSTR_ECODE;
516
- throw err;
517
- };
518
- let objAttr = null;
519
- try {
520
- objAttr = getXObjAttributes(obj, key);
521
- } catch (err) {
522
- throw err;
523
- };
524
- const attrName = attr.trim();
525
- if (objAttr !== null && attrName !== '') return objAttr[attrName];
526
- };
527
-
528
- /**
529
- * @function writeXObjAttrRaw
530
- * @param {object}
531
- * @param {ID_STRING}
532
- * @param {any}
533
- * @param {ID_STRING} [key]
534
- * @returns {bool}
535
- * @throws {TypeError}
536
- * @description Writes a parameter into a given object.
537
- */
538
- function writeXObjAttrRaw(obj, attr = '', value, key = XOBJ_DEF_ATTR_TNAME){
539
- if (typeof attr !== 'string') {
540
- let err = new TypeError(XOBJ_TE_NSTR_EMSG);
541
- err.code = XOBJ_TE_NSTR_ECODE;
542
- throw err;
543
- };
544
- const attrName = attr.trim();
545
- let objAttr = null;
546
- let isSUCCEED = false;
547
- if (attrName !== '' && value !== undefined) {
548
- try {
549
- objAttr = insertXObjElement(obj, key, { force: true });
550
- } catch (err) {
551
- switch (err.code) {
552
- case XOBJ_TE_NSTR_ECODE :
553
- case XOBJ_TE_KNES_ECODE : {
554
- break;
555
- }
556
- default: {
557
- throw err;
558
- break;
559
- }
560
- };
561
- };
562
- if (objAttr !== null) {
563
- objAttr[attrName] = value;
564
- isSUCCEED = true;
565
- };
566
- };
567
- return isSUCCEED;
568
- };
569
-
570
- /**
571
- * @function readXObjParam
572
- * @param {object}
573
- * @param {ID_STRING} [key]
574
- * @returns {string}
575
- * @throws {TypeError}
576
- * @description Extracts a parameter from a given object.
577
- */
578
- function readXObjParam(obj, key){
579
- let result = undefined;
580
- try {
581
- result = readXObjParamRaw(obj, key);
582
- } catch (err) {
583
- switch (err.code) {
584
- case XOBJ_TE_NSTR_ECODE : {
585
- break;
586
- }
587
- default: {
588
- throw err;
589
- break;
590
- }
591
- };
592
- };
593
- return readAsString(result, {
594
- useTrim: false,
595
- numberToString: true,
596
- boolToString: true,
597
- });
598
- };
599
-
600
- /**
601
- * @function readXObjParam
602
- * @param {object}
603
- * @param {bool}
604
- * @param {ID_STRING} [key]
605
- * @returns {bool}
606
- * @throws {TypeError}
607
- * @description Extracts a parameter from a given object.
608
- */
609
- function readXObjParamAsBool(obj, defValue, key){
610
- let result = undefined;
611
- try {
612
- result = readXObjParamRaw(obj, key);
613
- } catch (err) {
614
- switch (err.code) {
615
- case XOBJ_TE_NSTR_ECODE : {
616
- break;
617
- }
618
- default: {
619
- throw err;
620
- break;
621
- }
622
- };
623
- };
624
- return readAsBoolEx(result, defValue);
625
- };
626
-
627
- /**
628
- * @function readXObjParam
629
- * @param {object}
630
- * @param {number}
631
- * @param {ID_STRING} [key]
632
- * @returns {number}
633
- * @throws {TypeError}
634
- * @description Extracts a parameter from a given object.
635
- */
636
- function readXObjParamAsNum(obj, defValue, key){
637
- let result = undefined;
638
- try {
639
- result = readXObjParamRaw(obj, key);
640
- } catch (err) {
641
- switch (err.code) {
642
- case XOBJ_TE_NSTR_ECODE : {
643
- break;
644
- }
645
- default: {
646
- throw err;
647
- break;
648
- }
649
- };
650
- };
651
- return readAsNumberEx(result, defValue);
652
- };
653
-
654
- /**
655
- * @function readXObjParam
656
- * @param {object}
657
- * @param {string}
658
- * @param {ID_STRING} [key]
659
- * @returns {string}
660
- * @throws {TypeError}
661
- * @description Extracts a parameter from a given object.
662
- */
663
- function readXObjParamAsStr(obj, defValue, key){
664
- let result = undefined;
665
- try {
666
- result = readXObjParamRaw(obj, key);
667
- } catch (err) {
668
- switch (err.code) {
669
- case XOBJ_TE_NSTR_ECODE : {
670
- break;
671
- }
672
- default: {
673
- throw err;
674
- break;
675
- }
676
- };
677
- };
678
- return readAsString(result, {
679
- useTrim: false,
680
- numberToString: true,
681
- boolToString: true,
682
- defValue,
683
- });
684
- };
685
-
686
- /**
687
- * @function readXObjParam
688
- * @param {object}
689
- * @param {ID_STRING} [key]
690
- * @returns {index}
691
- * @throws {TypeError}
692
- * @description Extracts a parameter from a given object.
693
- */
694
- function readXObjParamAsIndex(obj, key){
695
- let result = undefined;
696
- try {
697
- result = readXObjParamRaw(obj, key);
698
- } catch (err) {
699
- switch (err.code) {
700
- case XOBJ_TE_NSTR_ECODE : {
701
- break;
702
- }
703
- default: {
704
- throw err;
705
- break;
706
- }
707
- };
708
- };
709
- return valueToIndex(result);
710
- };
711
-
712
- /**
713
- * @function writeXObjParam
714
- * @param {object}
715
- * @param {any}
716
- * @param {ID_STRING} [key]
717
- * @returns {bool}
718
- * @throws {TypeError}
719
- * @description Writes a parameter into a given object.
720
- */
721
- function writeXObjParam(obj, value, key){
722
- let isSUCCEED = false;
723
- if (value !== undefined) {
724
- const _value = readAsString(value, {
725
- useTrim: false,
726
- numberToString: true,
727
- boolToString: true,
728
- });
729
- try {
730
- isSUCCEED = writeXObjParamRaw(obj, _value, key);
731
- } catch (err) {
732
- switch (err.code) {
733
- case XOBJ_TE_NSTR_ECODE : {
734
- break;
735
- }
736
- default: {
737
- throw err;
738
- break;
739
- }
740
- };
741
- };
742
- };
743
- return isSUCCEED;
744
- };
745
-
746
- /**
747
- * @function writeXObjParamAsBool
748
- * @param {object}
749
- * @param {any}
750
- * @param {bool}
751
- * @param {ID_STRING} [key]
752
- * @returns {bool}
753
- * @throws {TypeError}
754
- * @description Writes a parameter into a given object.
755
- */
756
- function writeXObjParamAsBool(obj, value, defValue, key){
757
- let isSUCCEED = false;
758
- if (value !== undefined) {
759
- const _value = readAsBoolEx(value, defValue).toString();
760
- try {
761
- isSUCCEED = writeXObjParamRaw(obj, _value, key);
762
- } catch (err) {
763
- switch (err.code) {
764
- case XOBJ_TE_NSTR_ECODE : {
765
- break;
766
- }
767
- default: {
768
- throw err;
769
- break;
770
- }
771
- };
772
- };
773
- };
774
- return isSUCCEED;
775
- };
776
-
777
- /**
778
- * @function writeXObjParamAsNum
779
- * @param {object}
780
- * @param {any}
781
- * @param {number}
782
- * @param {ID_STRING} [key]
783
- * @returns {bool}
784
- * @throws {TypeError}
785
- * @description Writes a parameter into a given object.
786
- */
787
- function writeXObjParamAsNum(obj, value, defValue, key){
788
- let isSUCCEED = false;
789
- if (value !== undefined) {
790
- const _value = readAsNumberEx(value, defValue).toString();
791
- try {
792
- isSUCCEED = writeXObjParamRaw(obj, _value, key);
793
- } catch (err) {
794
- switch (err.code) {
795
- case XOBJ_TE_NSTR_ECODE : {
796
- break;
797
- }
798
- default: {
799
- throw err;
800
- break;
801
- }
802
- };
803
- };
804
- };
805
- return isSUCCEED;
806
- };
807
-
808
- /**
809
- * @function writeXObjParamAsIndex
810
- * @param {object}
811
- * @param {any}
812
- * @param {ID_STRING} [key]
813
- * @returns {bool}
814
- * @throws {TypeError}
815
- * @description Writes a parameter into a given object.
816
- */
817
- function writeXObjParamAsIndex(obj, value, key){
818
- let isSUCCEED = false;
819
- if (value !== undefined) {
820
- const _value = valueToIndex(value).toString();
821
- try {
822
- isSUCCEED = writeXObjParamRaw(obj, _value, key);
823
- } catch (err) {
824
- switch (err.code) {
825
- case XOBJ_TE_NSTR_ECODE : {
826
- break;
827
- }
828
- default: {
829
- throw err;
830
- break;
831
- }
832
- };
833
- };
834
- };
835
- return isSUCCEED;
836
- };
837
-
838
- /**
839
- * @function writeXObjParamEx
840
- * @param {object}
841
- * @param {any}
842
- * @param {any}
843
- * @param {ID_STRING} [key]
844
- * @returns {bool}
845
- * @throws {TypeError}
846
- * @description Writes a parameter into a given object.
847
- */
848
- function writeXObjParamEx(obj, value, defValue, key){
849
- let isSUCCEED = false;
850
- if (value !== undefined) {
851
- const _defValue = readAsString(defValue, {
852
- useTrim: false,
853
- numberToString: true,
854
- boolToString: true,
855
- });
856
- const _value = readAsString(value, {
857
- useTrim: false,
858
- numberToString: true,
859
- boolToString: true,
860
- defValue: _defValue,
861
- });
862
- try {
863
- isSUCCEED = writeXObjParamRaw(obj, _value, key);
864
- } catch (err) {
865
- switch (err.code) {
866
- case XOBJ_TE_NSTR_ECODE : {
867
- break;
868
- }
869
- default: {
870
- throw err;
871
- break;
872
- }
873
- };
874
- };
875
- };
876
- return isSUCCEED;
877
- };
878
-
879
- /**
880
- * @function readXObjAttr
881
- * @param {object}
882
- * @param {ID_STRING}
883
- * @param {ID_STRING} [key]
884
- * @returns {string}
885
- * @throws {TypeError}
886
- * @description Extracts an attribute from a given object.
887
- */
888
- function readXObjAttr(obj, attr, key){
889
- let result = undefined;
890
- try {
891
- result = readXObjAttrRaw(obj, attr, key);
892
- } catch (err) {
893
- switch (err.code) {
894
- case XOBJ_TE_NSTR_ECODE : {
895
- break;
896
- }
897
- default: {
898
- throw err;
899
- break;
900
- }
901
- };
902
- };
903
- return readAsString(result, {
904
- useTrim: true,
905
- numberToString: true,
906
- boolToString: true,
907
- });
908
- };
909
-
910
- /**
911
- * @function readXObjAttrAsBool
912
- * @param {object}
913
- * @param {ID_STRING}
914
- * @param {bool}
915
- * @param {ID_STRING} [key]
916
- * @returns {bool}
917
- * @throws {TypeError}
918
- * @description Extracts an attribute from a given object.
919
- */
920
- function readXObjAttrAsBool(obj, attr, defValue, key){
921
- let result = undefined;
922
- try {
923
- result = readXObjAttrRaw(obj, attr, key);
924
- } catch (err) {
925
- switch (err.code) {
926
- case XOBJ_TE_NSTR_ECODE : {
927
- break;
928
- }
929
- default: {
930
- throw err;
931
- break;
932
- }
933
- };
934
- };
935
- return readAsBoolEx(result, defValue);
936
- };
937
-
938
- /**
939
- * @function readXObjAttrAsNum
940
- * @param {object}
941
- * @param {ID_STRING}
942
- * @param {number}
943
- * @param {ID_STRING} [key]
944
- * @returns {number}
945
- * @throws {TypeError}
946
- * @description Extracts an attribute from a given object.
947
- */
948
- function readXObjAttrAsNum(obj, attr, defValue, key){
949
- let result = undefined;
950
- try {
951
- result = readXObjAttrRaw(obj, attr, key);
952
- } catch (err) {
953
- switch (err.code) {
954
- case XOBJ_TE_NSTR_ECODE : {
955
- break;
956
- }
957
- default: {
958
- throw err;
959
- break;
960
- }
961
- };
962
- };
963
- return readAsNumberEx(result, defValue);
964
- };
965
-
966
- /**
967
- * @function readXObjAttrAsStr
968
- * @param {object}
969
- * @param {ID_STRING}
970
- * @param {string}
971
- * @param {ID_STRING} [key]
972
- * @returns {string}
973
- * @throws {TypeError}
974
- * @description Extracts an attribute from a given object.
975
- */
976
- function readXObjAttrAsStr(obj, attr, defValue, key){
977
- let result = undefined;
978
- try {
979
- result = readXObjAttrRaw(obj, attr, key);
980
- } catch (err) {
981
- switch (err.code) {
982
- case XOBJ_TE_NSTR_ECODE : {
983
- break;
984
- }
985
- default: {
986
- throw err;
987
- break;
988
- }
989
- };
990
- };
991
- return readAsString(result, {
992
- useTrim: true,
993
- numberToString: true,
994
- boolToString: true,
995
- defValue,
996
- });
997
- };
998
-
999
- /**
1000
- * @function readXObjAttrAsIndex
1001
- * @param {object}
1002
- * @param {ID_STRING}
1003
- * @param {ID_STRING} [key]
1004
- * @returns {index}
1005
- * @throws {TypeError}
1006
- * @description Extracts an attribute from a given object.
1007
- */
1008
- function readXObjAttrAsIndex(obj, attr, key){
1009
- let result = undefined;
1010
- try {
1011
- result = readXObjAttrRaw(obj, attr, key);
1012
- } catch (err) {
1013
- switch (err.code) {
1014
- case XOBJ_TE_NSTR_ECODE : {
1015
- break;
1016
- }
1017
- default: {
1018
- throw err;
1019
- break;
1020
- }
1021
- };
1022
- };
1023
- return valueToIndex(result);
1024
- };
1025
-
1026
- /**
1027
- * @function writeXObjAttr
1028
- * @param {object}
1029
- * @param {ID_STRING}
1030
- * @param {any}
1031
- * @param {ID_STRING} [key]
1032
- * @returns {bool}
1033
- * @throws {TypeError}
1034
- * @description Writes a parameter into a given object.
1035
- */
1036
- function writeXObjAttr(obj, attr, value, key){
1037
- let isSUCCEED = false;
1038
- if (value !== undefined) {
1039
- const _value = readAsString(value, {
1040
- useTrim: true,
1041
- numberToString: true,
1042
- boolToString: true,
1043
- });
1044
- try {
1045
- isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
1046
- } catch (err) {
1047
- switch (err.code) {
1048
- case XOBJ_TE_NSTR_ECODE : {
1049
- break;
1050
- }
1051
- default: {
1052
- throw err;
1053
- break;
1054
- }
1055
- };
1056
- };
1057
- };
1058
- return isSUCCEED;
1059
- };
1060
-
1061
- /**
1062
- * @function writeXObjAttrAsBool
1063
- * @param {object}
1064
- * @param {ID_STRING}
1065
- * @param {any}
1066
- * @param {bool}
1067
- * @param {ID_STRING} [key]
1068
- * @returns {bool}
1069
- * @throws {TypeError}
1070
- * @description Writes a parameter into a given object.
1071
- */
1072
- function writeXObjAttrAsBool(obj, attr, value, defValue, key){
1073
- let isSUCCEED = false;
1074
- if (value !== undefined) {
1075
- const _value = readAsBoolEx(value, defValue).toString();
1076
- try {
1077
- isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
1078
- } catch (err) {
1079
- switch (err.code) {
1080
- case XOBJ_TE_NSTR_ECODE : {
1081
- break;
1082
- }
1083
- default: {
1084
- throw err;
1085
- break;
1086
- }
1087
- };
1088
- };
1089
- };
1090
- return isSUCCEED;
1091
- };
1092
-
1093
- /**
1094
- * @function writeXObjAttrAsNum
1095
- * @param {object}
1096
- * @param {ID_STRING}
1097
- * @param {any}
1098
- * @param {number}
1099
- * @param {ID_STRING} [key]
1100
- * @returns {bool}
1101
- * @throws {TypeError}
1102
- * @description Writes a parameter into a given object.
1103
- */
1104
- function writeXObjAttrAsNum(obj, attr, value, defValue, key){
1105
- let isSUCCEED = false;
1106
- if (value !== undefined) {
1107
- const _value = readAsNumberEx(value, defValue).toString();
1108
- try {
1109
- isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
1110
- } catch (err) {
1111
- switch (err.code) {
1112
- case XOBJ_TE_NSTR_ECODE : {
1113
- break;
1114
- }
1115
- default: {
1116
- throw err;
1117
- break;
1118
- }
1119
- };
1120
- };
1121
- };
1122
- return isSUCCEED;
1123
- };
1124
-
1125
- /**
1126
- * @function writeXObjAttrAsIndex
1127
- * @param {object}
1128
- * @param {ID_STRING}
1129
- * @param {any}
1130
- * @param {ID_STRING} [key]
1131
- * @returns {bool}
1132
- * @throws {TypeError}
1133
- * @description Writes a parameter into a given object.
1134
- */
1135
- function writeXObjAttrAsIndex(obj, attr, value, key){
1136
- let isSUCCEED = false;
1137
- if (value !== undefined) {
1138
- const _value = valueToIndex(value).toString();
1139
- try {
1140
- isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
1141
- } catch (err) {
1142
- switch (err.code) {
1143
- case XOBJ_TE_NSTR_ECODE : {
1144
- break;
1145
- }
1146
- default: {
1147
- throw err;
1148
- break;
1149
- }
1150
- };
1151
- };
1152
- };
1153
- return isSUCCEED;
1154
- };
1155
-
1156
- /**
1157
- * @function writeXObjAttrEx
1158
- * @param {object}
1159
- * @param {ID_STRING}
1160
- * @param {any}
1161
- * @param {any}
1162
- * @param {ID_STRING} [key]
1163
- * @returns {bool}
1164
- * @throws {TypeError}
1165
- * @description Writes a parameter into a given object.
1166
- */
1167
- function writeXObjAttrEx(obj, attr, value, defValue, key){
1168
- let isSUCCEED = false;
1169
- if (value !== undefined) {
1170
- const _defValue = readAsString(defValue, {
1171
- useTrim: true,
1172
- numberToString: true,
1173
- boolToString: true,
1174
- });
1175
- const _value = readAsString(value, {
1176
- useTrim: true,
1177
- numberToString: true,
1178
- boolToString: true,
1179
- defValue: _defValue,
1180
- });
1181
- try {
1182
- isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
1183
- } catch (err) {
1184
- switch (err.code) {
1185
- case XOBJ_TE_NSTR_ECODE : {
1186
- break;
1187
- }
1188
- default: {
1189
- throw err;
1190
- break;
1191
- }
1192
- };
1193
- };
1194
- };
1195
- return isSUCCEED;
1196
- };
1197
-
1198
- /**
1199
- * @function insertXObjElements
1200
- * @param {object}
1201
- * @param {...ID_STRING} args - list of a keys
1202
- * @param {object} [opt]
1203
- * @returns {number}
1204
- * @throws {TypeError}
1205
- * @description Inserts an elements into a given object.
1206
- */
1207
- function insertXObjElements(obj, ...args){
1208
- if (!isPlainObject(obj)) {
1209
- let err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
1210
- err.code = XOBJ_TE_NPOBJ_ECODE;
1211
- throw err;
1212
- };
1213
- const len = args.length;
1214
- const hasOpt = len > 0 && isPlainObject(args[len - 1]);
1215
- const opt = hasOpt ? args.pop() : {};
1216
- const names = readAsListS({
1217
- useTrim: true,
1218
- keepEmpty: false,
1219
- }, ...args);
1220
- let count = 0;
1221
- for (let key of names) {
1222
- if (insertXObjElement(obj, key, opt) !== null) count++;
1223
- };
1224
- return count;
1225
- };
1226
-
1227
- /**
1228
- * @function insertXObjEList
1229
- * @param {object}
1230
- * @param {ID_STRING}
1231
- * @param {object} [opt]
1232
- * @param {bool} [opt.force=false]
1233
- * @param {bool} [opt.ripOldies=false]
1234
- * @returns {?any}
1235
- * @throws {TypeError}
1236
- * @description Inserts a list elements into a given object.
1237
- */
1238
- function insertXObjEList(obj, name, opt){
1239
- let err = null;
1240
- if (!isPlainObject(obj)) {
1241
- err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
1242
- err.code = XOBJ_TE_NPOBJ_ECODE;
1243
- throw err;
1244
- };
1245
- if (typeof name !== 'string') {
1246
- err = new TypeError(XOBJ_TE_NSTR_EMSG);
1247
- err.code = XOBJ_TE_NSTR_ECODE;
1248
- throw err;
1249
- };
1250
- const key = name.trim();
1251
- if (key === '') {
1252
- err = new TypeError(XOBJ_TE_KNES_EMSG);
1253
- err.code = XOBJ_TE_KNES_ECODE;
1254
- throw err;
1255
- };
1256
- const _options = isPlainObject(opt) ? opt : {};
1257
- let { force, ripOldies } = _options;
1258
- if (typeof force !== 'boolean') force = false;
1259
- if (typeof ripOldies !== 'boolean') ripOldies = false;
1260
- let item = obj[key];
1261
- let isACCEPTED = (
1262
- isNullOrUndef(item)
1263
- || (force && (ripOldies || !isArray(item)))
1264
- );
1265
- if (isACCEPTED) {
1266
- obj[key] = item = [];
1267
- } else {
1268
- isACCEPTED = isArray(item);
1269
- if (!isACCEPTED && isPlainObject(item)) {
1270
- obj[key] = item = [ item ];
1271
- isACCEPTED = true;
1272
- };
1273
- };
1274
- return isACCEPTED ? item : null;
1275
- };
1276
-
1277
- /**
1278
- * @function insertXObjEChain
1279
- * @param {object}
1280
- * @param {ID_STRING}
1281
- * @param {...ID_STRING} args - a list of keys
1282
- * @param {object} [opt]
1283
- * @returns {?any}
1284
- * @throws {TypeError}
1285
- * @description Inserts a chain of an elements into a given object.
1286
- */
1287
- function insertXObjEChain(obj, ...args){
1288
- if (!isPlainObject(obj)) {
1289
- let err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
1290
- err.code = XOBJ_TE_NPOBJ_ECODE;
1291
- throw err;
1292
- };
1293
- const len = args.length;
1294
- const hasOpt = len > 0 && isPlainObject(args[len - 1]);
1295
- const opt = hasOpt ? args.pop() : {};
1296
- const names = readAsListS({
1297
- useTrim: true,
1298
- keepEmpty: false,
1299
- }, ...args);
1300
- let curObj = obj;
1301
- let isSUCCEED = false;
1302
- for (let key of names) {
1303
- obj = insertXObjElement(obj, key, opt);
1304
- isSUCCEED = isPlainObject(obj);
1305
- if (!isSUCCEED) break;
1306
- curObj = obj;
1307
- };
1308
- return isSUCCEED ? curObj : null;
1309
- };
1310
-
1311
- /***
1312
- * (* class definitions *)
1313
- */
1314
-
1315
- // === module exports block ===
1316
-
1317
- exports.XOBJ_DEF_PARAM_TNAME = XOBJ_DEF_PARAM_TNAME;
1318
- exports.XOBJ_DEF_ATTR_TNAME = XOBJ_DEF_ATTR_TNAME;
1319
-
1320
- exports.evalXObjEName = evalXObjEName;
1321
-
1322
- exports.readXObjParamRaw = readXObjParamRaw;
1323
- exports.readXObjParam = readXObjParam;
1324
- exports.readXObjParamAsBool = readXObjParamAsBool;
1325
- exports.readXObjParamAsNum = readXObjParamAsNum;
1326
- exports.readXObjParamAsStr = readXObjParamAsStr;
1327
- exports.readXObjParamAsIndex = readXObjParamAsIndex;
1328
- exports.writeXObjParamRaw = writeXObjParamRaw;
1329
- exports.writeXObjParam = writeXObjParam;
1330
- exports.writeXObjParamAsBool = writeXObjParamAsBool;
1331
- exports.writeXObjParamAsNum = writeXObjParamAsNum;
1332
- exports.writeXObjParamAsIndex = writeXObjParamAsIndex;
1333
- exports.writeXObjParamEx = writeXObjParamEx;
1334
-
1335
- exports.readXObjAttrRaw = readXObjAttrRaw;
1336
- exports.readXObjAttr = readXObjAttr;
1337
- exports.readXObjAttrAsBool = readXObjAttrAsBool;
1338
- exports.readXObjAttrAsNum = readXObjAttrAsNum;
1339
- exports.readXObjAttrAsStr = readXObjAttrAsStr;
1340
- exports.readXObjAttrAsIndex = readXObjAttrAsIndex;
1341
- exports.writeXObjAttrRaw = writeXObjAttrRaw;
1342
- exports.writeXObjAttr = writeXObjAttr;
1343
- exports.writeXObjAttrAsBool = writeXObjAttrAsBool;
1344
- exports.writeXObjAttrAsNum = writeXObjAttrAsNum;
1345
- exports.writeXObjAttrAsIndex = writeXObjAttrAsIndex;
1346
- exports.writeXObjAttrEx = writeXObjAttrEx;
1347
-
1348
- exports.getXObjAttributes = getXObjAttributes;
1349
- exports.checkXObjAttribute = checkXObjAttribute;
1350
- exports.deleteXObjAttribute = deleteXObjAttribute;
1351
-
1352
- exports.getXObjElement = getXObjElement;
1353
- exports.insertXObjElement = insertXObjElement;
1354
- exports.addXObjElement = addXObjElement;
1355
- exports.deleteXObjElement = deleteXObjElement;
1356
- exports.deleteXObjElementEx = deleteXObjElementEx;
1357
- exports.renameXObjElement = renameXObjElement;
1358
-
1359
- exports.insertXObjElements = insertXObjElements;
1360
- exports.insertXObjEList = insertXObjEList;
1361
- exports.insertXObjEChain = insertXObjEChain;
1362
-
1363
- exports.genXObjENameDescr = genXObjENameDescr;
1
+ // [v0.2.091-20240915]
2
+
3
+ // === module init block ===
4
+
5
+ const {
6
+ valueToIndex, valueToIDString,
7
+ readAsString, readAsBoolEx, readAsNumberEx,
8
+ isNullOrUndef,
9
+ isInteger,
10
+ isArray, isObject, isPlainObject,
11
+ readAsListS,
12
+ } = require('@ygracs/bsfoc-lib-js');
13
+
14
+ // === module extra block (helper functions) ===
15
+
16
+ /**
17
+ * @typedef RVAL_reason
18
+ * @type {object}
19
+ * @property {string} code - message ID
20
+ * @property {string} msg - message text
21
+ * @description A result of a value check ops.
22
+ */
23
+
24
+ /**
25
+ * @typedef VCOR_evalkname
26
+ * @type {object}
27
+ * @property {boolean} isSucceed - ops flag
28
+ * @property {(string|RVAL_reason)} value - result value or reson if failed
29
+ * @description A result of a value check ops.
30
+ */
31
+
32
+ /**
33
+ * @function evalKeyName
34
+ * @param {any} value
35
+ * @param {boolean} [opt=true]
36
+ * @returns {VCOR_evalkname}
37
+ * @inner
38
+ * @description Tries to convert a value into an ID.
39
+ */
40
+ function evalKeyName(value, opt = true) {
41
+ if (typeof value !== 'string') {
42
+ return {
43
+ isSucceed: false,
44
+ value: {
45
+ code: XOBJ_TE_NSTR_ECODE,
46
+ msg: XOBJ_TE_NSTR_EMSG,
47
+ },
48
+ };
49
+ };
50
+ const key = value.trim();
51
+ if (opt && key === '') {
52
+ return {
53
+ isSucceed: false,
54
+ value: {
55
+ code: XOBJ_TE_KNES_ECODE,
56
+ msg: XOBJ_TE_KNES_EMSG,
57
+ },
58
+ };
59
+ };
60
+ return {
61
+ isSucceed: true,
62
+ value: key,
63
+ };
64
+ };
65
+
66
+ // === module main block ===
67
+
68
+ /***
69
+ * (* constant definitions *)
70
+ */
71
+
72
+ const XOBJ_DEF_PARAM_TNAME = '__text';
73
+ const XOBJ_DEF_ATTR_TNAME = '__attr';
74
+
75
+ const XOBJ_TE_INVARG_EMSG = 'invalid argument';
76
+ const XOBJ_TE_NOBJ_EMSG = `${XOBJ_TE_INVARG_EMSG} (an object expected)`;
77
+ const XOBJ_TE_NOBJ_ECODE = 'ERR_XOBJ_NOBJ';
78
+ const XOBJ_TE_NARR_EMSG = `${XOBJ_TE_INVARG_EMSG} (an array expected)`;
79
+ const XOBJ_TE_NARR_ECODE = 'ERR_XOBJ_NARR';
80
+ const XOBJ_TE_NSTR_EMSG = `${XOBJ_TE_INVARG_EMSG} (a string expected)`;
81
+ const XOBJ_TE_NSTR_ECODE = 'ERR_XOBJ_NSTR';
82
+ const XOBJ_TE_NPOBJ_EMSG = `${XOBJ_TE_INVARG_EMSG} (a plain object expected)`;
83
+ const XOBJ_TE_NPOBJ_ECODE = 'ERR_XOBJ_NPOBJ';
84
+ const XOBJ_TE_ANES_EMSG = '<attr_name> must be a non-empty string';
85
+ const XOBJ_TE_ANES_ECODE = 'ERR_XOBJ_INVARG_ATTR';
86
+ const XOBJ_TE_KNES_EMSG = '<key_name> must be a non-empty string';
87
+ const XOBJ_TE_KNES_ECODE = 'ERR_XOBJ_INVARG_KEY';
88
+
89
+ /***
90
+ * (* function definitions *)
91
+ */
92
+
93
+ /**
94
+ * @function evalXObjEName
95
+ * @param {any}
96
+ * @returns {(null|number|string)}
97
+ * @description Tries to convert a value into an ID.
98
+ */
99
+ function evalXObjEName(value) {
100
+ //return valueToIDString(value); // // TODO: [?]
101
+ let name = value;
102
+ switch (typeof name) {
103
+ case 'number' : {
104
+ if (valueToIndex(name) === -1) name = null;
105
+ break;
106
+ }
107
+ case 'string' : {
108
+ name = name.trim();
109
+ if (name !== '') {
110
+ let value = Number(name);
111
+ if (!Number.isNaN(value)) {
112
+ name = (
113
+ value < 0 || !isInteger(value)
114
+ ? null
115
+ : value
116
+ );
117
+ };
118
+ } else {
119
+ name = null;
120
+ };
121
+ break;
122
+ }
123
+ default: {
124
+ name = null;
125
+ }
126
+ };
127
+ return name;
128
+ };
129
+
130
+ /**
131
+ * @function genXObjENameDescr
132
+ * @param {any}
133
+ * @returns {object}
134
+ * @description Tries to convert a value into an element name description.
135
+ */
136
+ function genXObjENameDescr(value) {
137
+ let result = null;
138
+ let name = null;
139
+ let conditions = null;
140
+ let isERR = false;
141
+ let tail = null;
142
+ if (typeof value === 'string') {
143
+ const re = /^\s*([^\[\]\s]+)?(\s*)(\[.*])?\s*$/;
144
+ tail = value.match(re);
145
+ //console.log('CHECK: '+JSON.stringify(tail, null, 2));
146
+ if (tail) {
147
+ if (tail[1]) {
148
+ name = tail[1];
149
+ if (name) {
150
+ if (tail[2] === '') {
151
+ if (tail[3]) {
152
+ const re = /\[(@{0,1})(?:([^\[=]*?)(?:(?=[=])(=)((?![\"\'])[^\]]*|(?=([\"\']))\5(.*)\5))?)](\s*.*)/;
153
+ tail = tail[3].match(re);
154
+ //console.log('CHECK: '+JSON.stringify(tail, null, 2));
155
+ if (tail) {
156
+ let name = evalXObjEName(tail[2]);
157
+ let type = tail[1] === '@' ? 'attribute' : 'child';
158
+ let value = undefined;
159
+ if (tail[3] === '=') value = tail[5] ? tail[6] : tail[4];
160
+ if (tail[7]) isERR = true;
161
+ conditions = {
162
+ name,
163
+ type,
164
+ value,
165
+ };
166
+ };
167
+ };
168
+ } else if (tail[3]) {
169
+ name = null;
170
+ };
171
+ };
172
+ };
173
+ };
174
+ } else {
175
+ name = value;
176
+ };
177
+ name = evalXObjEName(name);
178
+ if (name === null) isERR = true;
179
+ result = {
180
+ name,
181
+ conditions,
182
+ isERR,
183
+ };
184
+ return result;
185
+ };
186
+
187
+ /**
188
+ * @function getXObjElement
189
+ * @param {object} obj
190
+ * @param {string} name
191
+ * @returns {?any}
192
+ * @throws {TypeError} if first param is not an object
193
+ * @throws {TypeError} if second param is empty string or not a string at all
194
+ * @description Extracts an element from a given object by its key.
195
+ */
196
+ function getXObjElement(obj, name) {
197
+ if (!isPlainObject(obj)) {
198
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
199
+ err.code = XOBJ_TE_NPOBJ_ECODE;
200
+ throw err;
201
+ };
202
+ let { isSucceed, value: key } = evalKeyName(name);
203
+ if (!isSucceed) {
204
+ const { code, msg } = key;
205
+ const err = new TypeError(msg);
206
+ err.code = code;
207
+ throw err;
208
+ };
209
+ // TODO: [?] check type of obj[key_name]
210
+ return obj[key] !== undefined ? obj[key] : null;
211
+ };
212
+
213
+ /**
214
+ * @function getXObjAttributes
215
+ * @param {object} obj
216
+ * @param {string} [key=XOBJ_DEF_ATTR_TNAME]
217
+ * @returns {?object}
218
+ * @throws {TypeError} if first param is not an object
219
+ * @description Extracts an attributes from a given object by its key.
220
+ */
221
+ function getXObjAttributes(obj, key = XOBJ_DEF_ATTR_TNAME) {
222
+ let result = null;
223
+ try {
224
+ result = getXObjElement(obj, key);
225
+ } catch (err) {
226
+ switch (err.code) {
227
+ case XOBJ_TE_NSTR_ECODE :
228
+ case XOBJ_TE_KNES_ECODE : {
229
+ break;
230
+ }
231
+ default: {
232
+ throw err;
233
+ }
234
+ };
235
+ };
236
+ return isPlainObject(result) ? result : null;
237
+ };
238
+
239
+ /**
240
+ * @typedef RVAL_emodif
241
+ * @type {object}
242
+ * @property {boolean} isSucceed - ops flag
243
+ * @property {?object} item
244
+ * @description A result of an xObj modification ops
245
+ */
246
+
247
+ /**
248
+ * @function addXObjElement
249
+ * @param {object} obj
250
+ * @param {string} name
251
+ * @returns {RVAL_emodif}
252
+ * @throws {TypeError} if first param is not an object
253
+ * @throws {TypeError} if second param is empty string or not a string at all
254
+ * @description Adds an element addressed by its key to a given object.
255
+ */
256
+ function addXObjElement(obj, name) {
257
+ if (!isPlainObject(obj)) {
258
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
259
+ err.code = XOBJ_TE_NPOBJ_ECODE;
260
+ throw err;
261
+ };
262
+ let { isSucceed, value: key } = evalKeyName(name);
263
+ if (!isSucceed) {
264
+ const { code, msg } = key;
265
+ const err = new TypeError(msg);
266
+ err.code = code;
267
+ throw err;
268
+ };
269
+ const item = {};
270
+ let prop = obj[key];
271
+ isSucceed = false;
272
+ // // TODO: [?] consider wheter or not do ops if new_key exists
273
+ if (isNullOrUndef(prop)) {
274
+ obj[key] = prop = item;
275
+ isSucceed = true;
276
+ } else if (isObject(prop)) {
277
+ if (isArray(prop)) {
278
+ prop.push(item);
279
+ } else {
280
+ obj[key] = [ prop, item ];
281
+ };
282
+ prop = item;
283
+ isSucceed = true;
284
+ };
285
+ return {
286
+ isSucceed,
287
+ item: isSucceed ? prop : null,
288
+ };
289
+ };
290
+
291
+ /**
292
+ * typedef OPT_inselops_L
293
+ * type {object}
294
+ * @property {boolean} [force=false]
295
+ * @property {boolean} [ripOldies=false]
296
+ * @property {boolean} [acceptIfList=false]
297
+ */
298
+
299
+ /**
300
+ * @function insertXObjElement
301
+ * @param {object} obj
302
+ * @param {string} name
303
+ * @param {OPT_inselops_L} [opt]
304
+ * @returns {?object}
305
+ * @throws {TypeError} if first param is not an object
306
+ * @description Inserts an element addressed by its key into a given object.
307
+ */
308
+ function insertXObjElement(...args) {
309
+ let item = null;
310
+ try {
311
+ ({ item } = insertXObjElementEx(...args));
312
+ } catch (err) {
313
+ switch (err.code) {
314
+ case XOBJ_TE_NSTR_ECODE :
315
+ case XOBJ_TE_KNES_ECODE : {
316
+ break;
317
+ }
318
+ default: {
319
+ throw err;
320
+ }
321
+ };
322
+ };
323
+ return item;
324
+ };
325
+
326
+ /**
327
+ * @function insertXObjElementEx
328
+ * @param {object} obj
329
+ * @param {string} name
330
+ * @param {OPT_inselops_L} [opt]
331
+ * @returns {RVAL_emodif}
332
+ * @throws {TypeError} if first param is not an object
333
+ * @throws {TypeError} if second param is empty string or not a string at all
334
+ * @since 0.2.0
335
+ * @description Inserts an element addressed by its key into a given object.
336
+ */
337
+ function insertXObjElementEx(obj, name, opt) {
338
+ if (!isPlainObject(obj)) {
339
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
340
+ err.code = XOBJ_TE_NPOBJ_ECODE;
341
+ throw err;
342
+ };
343
+ let { isSucceed, value: key } = evalKeyName(name);
344
+ if (!isSucceed) {
345
+ const { code, msg } = key;
346
+ const err = new TypeError(msg);
347
+ err.code = code;
348
+ throw err;
349
+ };
350
+ const item = {};
351
+ let prop = obj[key];
352
+ isSucceed = false;
353
+ if (isNullOrUndef(prop)) {
354
+ obj[key] = prop = item;
355
+ isSucceed = true;
356
+ } else {
357
+ const _opt = isPlainObject(opt) ? opt : {};
358
+ let { force, ripOldies, acceptIfList } = _opt;
359
+ if (typeof force !== 'boolean') force = false;
360
+ if (typeof ripOldies !== 'boolean') ripOldies = false;
361
+ if (typeof acceptIfList !== 'boolean') acceptIfList = false;
362
+ if (force && (ripOldies || !isObject(prop))) {
363
+ obj[key] = prop = item;
364
+ isSucceed = true;
365
+ } else {
366
+ isSucceed = isPlainObject(prop) || (isArray(prop) && acceptIfList);
367
+ };
368
+ };
369
+ return {
370
+ isSucceed,
371
+ item: isSucceed ? prop : null,
372
+ };
373
+ };
374
+
375
+ /**
376
+ * @function deleteXObjElement
377
+ * @param {object} obj
378
+ * @param {string} name
379
+ * @returns {boolean}
380
+ * @throws {TypeError} if first param is not an object
381
+ * @description Deletes an element addressed by its key from a given object.
382
+ */
383
+ function deleteXObjElement(...args) {
384
+ let isSucceed = false;
385
+ try {
386
+ ({ isSucceed } = deleteXObjElementEx(...args));
387
+ } catch (err) {
388
+ switch (err.code) {
389
+ case XOBJ_TE_NSTR_ECODE :
390
+ case XOBJ_TE_KNES_ECODE : {
391
+ break;
392
+ }
393
+ default: {
394
+ throw err;
395
+ }
396
+ };
397
+ };
398
+ return isSucceed;
399
+ };
400
+
401
+ /**
402
+ * @function deleteXObjElementEx
403
+ * @param {object} obj
404
+ * @param {string} name
405
+ * @returns {RVAL_emodif}
406
+ * @throws {TypeError} if first param is not an object
407
+ * @throws {TypeError} if second param is empty string or not a string at all
408
+ * @description Deletes an element addressed by its key from a given object.
409
+ */
410
+ function deleteXObjElementEx(obj, name) {
411
+ if (!isPlainObject(obj)) {
412
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
413
+ err.code = XOBJ_TE_NPOBJ_ECODE;
414
+ throw err;
415
+ };
416
+ let { isSucceed, value: key } = evalKeyName(name);
417
+ if (!isSucceed) {
418
+ const { code, msg } = key;
419
+ const err = new TypeError(msg);
420
+ err.code = code;
421
+ throw err;
422
+ };
423
+ let prop = obj[key];
424
+ isSucceed = false;
425
+ // // TODO: catch errors in strict mode
426
+ isSucceed = delete obj[key];
427
+ return {
428
+ isSucceed,
429
+ item: isSucceed && isObject(prop) ? prop : null,
430
+ };
431
+ };
432
+
433
+ /**
434
+ * @function renameXObjElement
435
+ * @param {object} obj
436
+ * @param {string} name - old key
437
+ * @param {string} newName - new key
438
+ * @returns {boolean}
439
+ * @throws {TypeError} if first param is not an object
440
+ * @throws {TypeError} if second param is not a string
441
+ * @throws {TypeError} if third param is not a string
442
+ * @description Renames an element addressed by its key.
443
+ */
444
+ function renameXObjElement(obj, name = '', newName = '') {
445
+ if (!isPlainObject(obj)) {
446
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
447
+ err.code = XOBJ_TE_NPOBJ_ECODE;
448
+ throw err;
449
+ };
450
+ const opt = false;
451
+ let { isSucceed: isAcceptON, value: oname } = evalKeyName(name, opt);
452
+ if (!isAcceptON) {
453
+ const { code, msg } = oname;
454
+ const err = new TypeError(msg);
455
+ err.code = code;
456
+ throw err;
457
+ };
458
+ let { isSucceed: isAcceptNN, value: nname } = evalKeyName(newName, opt);
459
+ if (!isAcceptNN) {
460
+ const { code, msg } = nname;
461
+ const err = new TypeError(msg);
462
+ err.code = code;
463
+ throw err;
464
+ };
465
+ let isSucceed = false;
466
+ if (oname !== '' && oname in obj && nname !== '') {
467
+ isSucceed = true;
468
+ if (oname !== nname) {
469
+ const prop = obj[oname];
470
+ obj[newName] = prop;
471
+ isSucceed = delete obj[oname];
472
+ if (!isSucceed) {
473
+ // undo change if failed delete old element
474
+ delete obj[nname];
475
+ };
476
+ };
477
+ };
478
+ return isSucceed;
479
+ };
480
+
481
+ /**
482
+ * @function checkXObjAttribute
483
+ * @param {object} obj
484
+ * @param {string} attr
485
+ * @param {string} [key]
486
+ * @returns {boolean}
487
+ * @throws {TypeError} if first param is not an object
488
+ * @description Checks wheter an attribute is exists.
489
+ */
490
+ function checkXObjAttribute(obj, attr = '', key) {
491
+ let _obj = null;
492
+ try {
493
+ _obj = getXObjAttributes(obj, key);
494
+ } catch (err) {
495
+ throw err;
496
+ };
497
+ if (_obj === null) return false;
498
+ let { isSucceed, value: name } = evalKeyName(attr, false);
499
+ if (isSucceed) {
500
+ if (name === '') return false;
501
+ } else {
502
+ const { code, msg } = name;
503
+ const err = new TypeError(msg);
504
+ err.code = code;
505
+ throw err;
506
+ };
507
+ return _obj[name] !== undefined;
508
+ };
509
+
510
+ /**
511
+ * @function deleteXObjAttribute
512
+ * @param {object} obj
513
+ * @param {string} attr
514
+ * @param {string} [key]
515
+ * @returns {boolean}
516
+ * @throws {TypeError} if first param is not an object
517
+ * @description Deletes an attribute addressed by a given name.
518
+ */
519
+ function deleteXObjAttribute(obj, attr = '', key) {
520
+ let _obj = null;
521
+ try {
522
+ _obj = getXObjAttributes(obj, key);
523
+ } catch (err) {
524
+ throw err;
525
+ };
526
+ if (_obj === null) return false;
527
+ let { isSucceed, value: name } = evalKeyName(attr, false);
528
+ if (!isSucceed) {
529
+ const { code, msg } = name;
530
+ const err = new TypeError(msg);
531
+ err.code = code;
532
+ throw err;
533
+ };
534
+ isSucceed = false;
535
+ if (name !== '') {
536
+ // // TODO: catch errors in strict mode
537
+ isSucceed = delete _obj[name];
538
+ };
539
+ return isSucceed;
540
+ };
541
+
542
+ /**
543
+ * @function renameXObjAttribute
544
+ * @param {object} obj
545
+ * @param {string} attr
546
+ * @param {string} newName
547
+ * @param {string} [key]
548
+ * @returns {boolean}
549
+ * @throws {TypeError} if first param is not an object
550
+ * @throws {TypeError} if second param is not an object
551
+ * @throws {TypeError} if third param is not an object
552
+ * @since 0.2.0
553
+ * @description Renames an attribute addressed by a given name.
554
+ */
555
+ function renameXObjAttribute(obj, attr = '', newName = '', key = XOBJ_DEF_ATTR_TNAME) {
556
+ if (!isPlainObject(obj)) {
557
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
558
+ err.code = XOBJ_TE_NPOBJ_ECODE;
559
+ throw err;
560
+ };
561
+ const opt = false;
562
+ let { isSucceed, value: _key } = evalKeyName(key, opt);
563
+ if (!isSucceed) {
564
+ const { code, msg } = _key;
565
+ const err = new TypeError(msg);
566
+ err.code = code;
567
+ throw err;
568
+ };
569
+ isSucceed = false;
570
+ if (_key !== '') {
571
+ let _obj = obj[_key];
572
+ if (isPlainObject(_obj)) {
573
+ let { isSucceed: isAcceptON, value: oname } = evalKeyName(attr, opt);
574
+ if (!isAcceptON) {
575
+ const { code, msg } = oname;
576
+ const err = new TypeError(msg);
577
+ err.code = code;
578
+ throw err;
579
+ };
580
+ let { isSucceed: isAcceptNN, value: nname } = evalKeyName(newName, opt);
581
+ if (!isAcceptNN) {
582
+ const { code, msg } = nname;
583
+ const err = new TypeError(msg);
584
+ err.code = code;
585
+ throw err;
586
+ };
587
+ if (oname !== '' && oname in _obj && nname !== '') {
588
+ if (oname !== nname) {
589
+ _obj = Object.entries(_obj);
590
+ const index = _obj.findIndex((item) => item[0] === oname);
591
+ _obj[index][0] = nname;
592
+ obj[_key] = Object.fromEntries(_obj);
593
+ };
594
+ isSucceed = true;
595
+ };
596
+ };
597
+ };
598
+ return isSucceed;
599
+ };
600
+
601
+ /**
602
+ * @function readXObjParamRaw
603
+ * @param {object} obj
604
+ * @param {string} [key=XOBJ_DEF_PARAM_TNAME]
605
+ * @returns {any}
606
+ * @throws {TypeError} if first param is not an object
607
+ * @throws {TypeError} if third param is not a string
608
+ * @description Extracts a parameter 'AS IS' from a given object.
609
+ */
610
+ function readXObjParamRaw(obj, key = XOBJ_DEF_PARAM_TNAME) {
611
+ if (!isPlainObject(obj)) {
612
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
613
+ err.code = XOBJ_TE_NPOBJ_ECODE;
614
+ throw err;
615
+ };
616
+ let { isSucceed, value: _key } = evalKeyName(key, false);
617
+ if (!isSucceed) {
618
+ const { code, msg } = _key;
619
+ const err = new TypeError(msg);
620
+ err.code = code;
621
+ throw err;
622
+ };
623
+ return _key !== '' ? obj[_key] : undefined;
624
+ };
625
+
626
+ /**
627
+ * @function writeXObjParamRaw
628
+ * @param {object} obj
629
+ * @param {any} value
630
+ * @param {string} [key=XOBJ_DEF_PARAM_TNAME]
631
+ * @returns {boolean}
632
+ * @throws {TypeError} if first param is not an object
633
+ * @throws {TypeError} if third param is not a string
634
+ * @description Writes a parameter 'AS IS' into a given object.
635
+ */
636
+ function writeXObjParamRaw(obj, value, key = XOBJ_DEF_PARAM_TNAME) {
637
+ if (!isPlainObject(obj)) {
638
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
639
+ err.code = XOBJ_TE_NPOBJ_ECODE;
640
+ throw err;
641
+ };
642
+ let { isSucceed, value: _key } = evalKeyName(key, false);
643
+ if (!isSucceed) {
644
+ const { code, msg } = _key;
645
+ const err = new TypeError(msg);
646
+ err.code = code;
647
+ throw err;
648
+ };
649
+ if (_key === '' || value === undefined) {
650
+ isSucceed = false;
651
+ } else {
652
+ obj[_key] = value;
653
+ };
654
+ return isSucceed;
655
+ };
656
+
657
+ /**
658
+ * @function readXObjAttrRaw
659
+ * @param {object} obj
660
+ * @param {string} attr
661
+ * @param {string} [key]
662
+ * @returns {any}
663
+ * @throws {TypeError} if first param is not an object
664
+ * @throws {TypeError} if third param is not a string
665
+ * @description Extracts an attribute 'AS IS' from a given object.
666
+ */
667
+ function readXObjAttrRaw(obj, attr = '', key) {
668
+ let _obj = null;
669
+ try {
670
+ _obj = getXObjAttributes(obj, key);
671
+ } catch (err) {
672
+ throw err;
673
+ };
674
+ if (_obj !== null) {
675
+ let { isSucceed, value: name } = evalKeyName(attr, false);
676
+ if (!isSucceed) {
677
+ const { code, msg } = name;
678
+ const err = new TypeError(msg);
679
+ err.code = code;
680
+ throw err;
681
+ };
682
+ if (name !== '') return _obj[name];
683
+ };
684
+ };
685
+
686
+ /**
687
+ * @function writeXObjAttrRaw
688
+ * @param {object} obj
689
+ * @param {string} attr
690
+ * @param {any} value
691
+ * @param {string} [key]
692
+ * @returns {boolean}
693
+ * @throws {TypeError} if first param is not an object
694
+ * @throws {TypeError} if third param is not a string
695
+ * @description Writes a parameter into a given object.
696
+ */
697
+ function writeXObjAttrRaw(obj, attr = '', value, key = XOBJ_DEF_ATTR_TNAME) {
698
+ let { isSucceed, value: name } = evalKeyName(attr, false);
699
+ if (!isSucceed) {
700
+ const { code, msg } = name;
701
+ const err = new TypeError(msg);
702
+ err.code = code;
703
+ throw err;
704
+ };
705
+ isSucceed = false;
706
+ if (name !== '' && value !== undefined) {
707
+ let _obj = null;
708
+ try {
709
+ const opt = { force: true, acceptIfList: true };
710
+ _obj = insertXObjElement(obj, key, opt);
711
+ } catch (err) {
712
+ throw err;
713
+ };
714
+ if (isArray(_obj)) {
715
+ // force a replacement of the old element if it's array
716
+ try {
717
+ const opt = { force: true, ripOldies: true };
718
+ _obj = insertXObjElement(obj, key, opt);
719
+ } catch (err) {
720
+ throw err;
721
+ };
722
+ };
723
+ if (_obj !== null) {
724
+ _obj[name] = value;
725
+ isSucceed = true;
726
+ };
727
+ };
728
+ return isSucceed;
729
+ };
730
+
731
+ /**
732
+ * @function readXObjParam
733
+ * @param {object} obj
734
+ * @param {string} [key]
735
+ * @returns {string}
736
+ * @throws {TypeError} if first param is not an object
737
+ * @description Extracts a parameter from a given object
738
+ * and returns it as string.
739
+ */
740
+ function readXObjParam(obj, key) {
741
+ const opt = {
742
+ useTrim: false,
743
+ numberToString: true,
744
+ boolToString: true,
745
+ defValue: '',
746
+ };
747
+ let result = undefined;
748
+ try {
749
+ result = readXObjParamEx(obj, opt, key);
750
+ } catch (err) {
751
+ throw err;
752
+ };
753
+ return result;
754
+ };
755
+
756
+ /**
757
+ * @function readXObjParamAsBool
758
+ * @param {object} obj
759
+ * @param {boolean} [defValue]
760
+ * @param {string} [key]
761
+ * @returns {boolean}
762
+ * @throws {TypeError} if first param is not an object
763
+ * @description Extracts a parameter from a given object
764
+ * and returns it as boolean.
765
+ */
766
+ function readXObjParamAsBool(obj, defValue, key) {
767
+ let result = undefined;
768
+ try {
769
+ result = readXObjParamRaw(obj, key);
770
+ } catch (err) {
771
+ switch (err.code) {
772
+ case XOBJ_TE_NSTR_ECODE : {
773
+ break;
774
+ }
775
+ default: {
776
+ throw err;
777
+ }
778
+ };
779
+ };
780
+ return readAsBoolEx(result, defValue);
781
+ };
782
+
783
+ /**
784
+ * @function readXObjParamAsNum
785
+ * @param {object} obj
786
+ * @param {number} [defValue]
787
+ * @param {string} [key]
788
+ * @returns {number}
789
+ * @throws {TypeError} if first param is not an object
790
+ * @description Extracts a parameter from a given object
791
+ * and returns it as number.
792
+ */
793
+ function readXObjParamAsNum(obj, defValue, key) {
794
+ let result = undefined;
795
+ try {
796
+ result = readXObjParamRaw(obj, key);
797
+ } catch (err) {
798
+ switch (err.code) {
799
+ case XOBJ_TE_NSTR_ECODE : {
800
+ break;
801
+ }
802
+ default: {
803
+ throw err;
804
+ }
805
+ };
806
+ };
807
+ return readAsNumberEx(result, defValue);
808
+ };
809
+
810
+ /**
811
+ * @function readXObjParamEx
812
+ * @param {object} obj
813
+ * @param {any} [opt]
814
+ * @param {string} [key]
815
+ * @returns {string}
816
+ * @throws {TypeError} if first param is not an object
817
+ * @description Extracts a parameter from a given object
818
+ * and returns it as string.
819
+ */
820
+ function readXObjParamEx(obj, opt, key) {
821
+ let result = undefined;
822
+ try {
823
+ result = readXObjParamRaw(obj, key);
824
+ } catch (err) {
825
+ switch (err.code) {
826
+ case XOBJ_TE_NSTR_ECODE : {
827
+ break;
828
+ }
829
+ default: {
830
+ throw err;
831
+ }
832
+ };
833
+ };
834
+ let _opt = opt;
835
+ if (!isPlainObject(_opt)) {
836
+ _opt = {
837
+ useTrim: false,
838
+ numberToString: true,
839
+ boolToString: true,
840
+ defValue: _opt,
841
+ };
842
+ };
843
+ return readAsString(result, _opt);
844
+ };
845
+
846
+ /**
847
+ * @function readXObjParamAsIndex
848
+ * @param {object} obj
849
+ * @param {string} [key]
850
+ * @returns {number}
851
+ * @throws {TypeError} if first param is not an object
852
+ * @description Extracts a parameter from a given object
853
+ * and returns it as 'index' value.
854
+ */
855
+ function readXObjParamAsIndex(obj, key) {
856
+ let result = undefined;
857
+ try {
858
+ result = readXObjParamRaw(obj, key);
859
+ } catch (err) {
860
+ switch (err.code) {
861
+ case XOBJ_TE_NSTR_ECODE : {
862
+ break;
863
+ }
864
+ default: {
865
+ throw err;
866
+ }
867
+ };
868
+ };
869
+ return valueToIndex(result);
870
+ };
871
+
872
+ /**
873
+ * @function writeXObjParam
874
+ * @param {object} obj
875
+ * @param {any} value
876
+ * @param {string} [key]
877
+ * @returns {boolean}
878
+ * @throws {TypeError} if first param is not an object
879
+ * @description Tries to convert a given value to a string
880
+ * and writes it as a parameter into a given object.
881
+ */
882
+ function writeXObjParam(obj, value, key) {
883
+ let isSucceed = false;
884
+ try {
885
+ const opt = {
886
+ useTrim: false,
887
+ numberToString: true,
888
+ boolToString: true,
889
+ defValue: '',
890
+ };
891
+ isSucceed = writeXObjParamEx(obj, value, opt, key);
892
+ } catch (err) {
893
+ throw err;
894
+ };
895
+ return isSucceed;
896
+ };
897
+
898
+ /**
899
+ * @function writeXObjParamAsBool
900
+ * @param {object} obj
901
+ * @param {any} value
902
+ * @param {boolean} [defValue]
903
+ * @param {string} [key]
904
+ * @returns {boolean}
905
+ * @throws {TypeError} if first param is not an object
906
+ * @description Tries to convert a given value to a boolean
907
+ * and writes it as a parameter into a given object.
908
+ */
909
+ function writeXObjParamAsBool(obj, value, defValue, key) {
910
+ let isSucceed = false;
911
+ if (value !== undefined || typeof defValue === 'boolean') {
912
+ const _value = readAsBoolEx(value, defValue).toString();
913
+ try {
914
+ isSucceed = writeXObjParamRaw(obj, _value, key);
915
+ } catch (err) {
916
+ switch (err.code) {
917
+ case XOBJ_TE_NSTR_ECODE : {
918
+ break;
919
+ }
920
+ default: {
921
+ throw err;
922
+ }
923
+ };
924
+ };
925
+ };
926
+ return isSucceed;
927
+ };
928
+
929
+ /**
930
+ * @function writeXObjParamAsNum
931
+ * @param {object} obj
932
+ * @param {any} value
933
+ * @param {number} [defValue]
934
+ * @param {string} [key]
935
+ * @returns {boolean}
936
+ * @throws {TypeError} if first param is not an object
937
+ * @description Tries to convert a given value to a number
938
+ * and writes it as a parameter into a given object.
939
+ */
940
+ function writeXObjParamAsNum(obj, value, defValue, key) {
941
+ let isSucceed = false;
942
+ if (value !== undefined || typeof defValue === 'number') {
943
+ const _value = readAsNumberEx(value, defValue).toString();
944
+ try {
945
+ isSucceed = writeXObjParamRaw(obj, _value, key);
946
+ } catch (err) {
947
+ switch (err.code) {
948
+ case XOBJ_TE_NSTR_ECODE : {
949
+ break;
950
+ }
951
+ default: {
952
+ throw err;
953
+ }
954
+ };
955
+ };
956
+ };
957
+ return isSucceed;
958
+ };
959
+
960
+ /**
961
+ * @function writeXObjParamAsIndex
962
+ * @param {object} obj
963
+ * @param {any} value
964
+ * @param {string} [key]
965
+ * @returns {boolean}
966
+ * @throws {TypeError} if first param is not an object
967
+ * @description Tries to convert a given value into an 'index' value
968
+ * and writes it as a parameter into a given object.
969
+ */
970
+ function writeXObjParamAsIndex(obj, value, key) {
971
+ let isSucceed = false;
972
+ if (value !== undefined) {
973
+ const _value = valueToIndex(value).toString();
974
+ try {
975
+ isSucceed = writeXObjParamRaw(obj, _value, key);
976
+ } catch (err) {
977
+ switch (err.code) {
978
+ case XOBJ_TE_NSTR_ECODE : {
979
+ break;
980
+ }
981
+ default: {
982
+ throw err;
983
+ }
984
+ };
985
+ };
986
+ };
987
+ return isSucceed;
988
+ };
989
+
990
+ /**
991
+ * @function writeXObjParamEx
992
+ * @param {object} obj
993
+ * @param {any} value
994
+ * @param {any} [opt]
995
+ * @param {string} [key]
996
+ * @returns {boolean}
997
+ * @throws {TypeError} if first param is not an object
998
+ * @description Tries to convert a given value to a string
999
+ * and writes it as a parameter into a given object.
1000
+ */
1001
+ function writeXObjParamEx(obj, value, opt, key) {
1002
+ let isSucceed = false;
1003
+ if (value !== undefined) {
1004
+ let _opt = opt;
1005
+ if (!isPlainObject(_opt)) {
1006
+ const defValue = readAsString(_opt, {
1007
+ useTrim: false,
1008
+ numberToString: true,
1009
+ boolToString: true,
1010
+ });
1011
+ _opt = {
1012
+ useTrim: false,
1013
+ numberToString: true,
1014
+ boolToString: true,
1015
+ defValue,
1016
+ };
1017
+ };
1018
+ const _value = readAsString(value, _opt);
1019
+ try {
1020
+ isSucceed = writeXObjParamRaw(obj, _value, key);
1021
+ } catch (err) {
1022
+ switch (err.code) {
1023
+ case XOBJ_TE_NSTR_ECODE : {
1024
+ break;
1025
+ }
1026
+ default: {
1027
+ throw err;
1028
+ }
1029
+ };
1030
+ };
1031
+ };
1032
+ return isSucceed;
1033
+ };
1034
+
1035
+ /**
1036
+ * @function readXObjAttr
1037
+ * @param {object} obj
1038
+ * @param {string} attr
1039
+ * @param {string} [key]
1040
+ * @returns {string}
1041
+ * @throws {TypeError} if first param is not an object
1042
+ * @description Extracts an attribute from a given object
1043
+ * and returns it as string.
1044
+ */
1045
+ function readXObjAttr(obj, attr, key) {
1046
+ const opt = {
1047
+ useTrim: true,
1048
+ numberToString: true,
1049
+ boolToString: true,
1050
+ defValue: '',
1051
+ };
1052
+ let result = undefined;
1053
+ try {
1054
+ result = readXObjAttrEx(obj, attr, opt, key);
1055
+ } catch (err) {
1056
+ throw err;
1057
+ };
1058
+ return result;
1059
+ };
1060
+
1061
+ /**
1062
+ * @function readXObjAttrAsBool
1063
+ * @param {object} obj
1064
+ * @param {string} attr
1065
+ * @param {boolean} [defValue]
1066
+ * @param {string} [key]
1067
+ * @returns {boolean}
1068
+ * @throws {TypeError} if first param is not an object
1069
+ * @description Extracts an attribute from a given object
1070
+ * and returns it as boolean.
1071
+ */
1072
+ function readXObjAttrAsBool(obj, attr, defValue, key) {
1073
+ let result = undefined;
1074
+ try {
1075
+ result = readXObjAttrRaw(obj, attr, key);
1076
+ } catch (err) {
1077
+ switch (err.code) {
1078
+ case XOBJ_TE_NSTR_ECODE : {
1079
+ break;
1080
+ }
1081
+ default: {
1082
+ throw err;
1083
+ }
1084
+ };
1085
+ };
1086
+ return readAsBoolEx(result, defValue);
1087
+ };
1088
+
1089
+ /**
1090
+ * @function readXObjAttrAsNum
1091
+ * @param {object} obj
1092
+ * @param {string} attr
1093
+ * @param {number} [defValue]
1094
+ * @param {string} [key]
1095
+ * @returns {number}
1096
+ * @throws {TypeError} if first param is not an object
1097
+ * @description Extracts an attribute from a given object
1098
+ * and returns it as number.
1099
+ */
1100
+ function readXObjAttrAsNum(obj, attr, defValue, key) {
1101
+ let result = undefined;
1102
+ try {
1103
+ result = readXObjAttrRaw(obj, attr, key);
1104
+ } catch (err) {
1105
+ switch (err.code) {
1106
+ case XOBJ_TE_NSTR_ECODE : {
1107
+ break;
1108
+ }
1109
+ default: {
1110
+ throw err;
1111
+ }
1112
+ };
1113
+ };
1114
+ return readAsNumberEx(result, defValue);
1115
+ };
1116
+
1117
+ /**
1118
+ * @function readXObjAttrEx
1119
+ * @param {object} obj
1120
+ * @param {string} attr
1121
+ * @param {any} [opt]
1122
+ * @param {string} [key]
1123
+ * @returns {string}
1124
+ * @throws {TypeError} if first param is not an object
1125
+ * @description Extracts an attribute from a given object
1126
+ * and returns it as string.
1127
+ */
1128
+ function readXObjAttrEx(obj, attr, opt, key) {
1129
+ let result = undefined;
1130
+ try {
1131
+ result = readXObjAttrRaw(obj, attr, key);
1132
+ } catch (err) {
1133
+ switch (err.code) {
1134
+ case XOBJ_TE_NSTR_ECODE : {
1135
+ break;
1136
+ }
1137
+ default: {
1138
+ throw err;
1139
+ }
1140
+ };
1141
+ };
1142
+ let _opt = opt;
1143
+ if (!isPlainObject(_opt)) {
1144
+ _opt = {
1145
+ useTrim: true,
1146
+ numberToString: true,
1147
+ boolToString: true,
1148
+ defValue: _opt,
1149
+ };
1150
+ };
1151
+ return readAsString(result, _opt);
1152
+ };
1153
+
1154
+ /**
1155
+ * @function readXObjAttrAsIndex
1156
+ * @param {object} obj
1157
+ * @param {string} attr
1158
+ * @param {string} [key]
1159
+ * @returns {number}
1160
+ * @throws {TypeError} if first param is not an object
1161
+ * @description Extracts an attribute from a given object
1162
+ * and returns it as 'index' value.
1163
+ */
1164
+ function readXObjAttrAsIndex(obj, attr, key) {
1165
+ let result = undefined;
1166
+ try {
1167
+ result = readXObjAttrRaw(obj, attr, key);
1168
+ } catch (err) {
1169
+ switch (err.code) {
1170
+ case XOBJ_TE_NSTR_ECODE : {
1171
+ break;
1172
+ }
1173
+ default: {
1174
+ throw err;
1175
+ }
1176
+ };
1177
+ };
1178
+ return valueToIndex(result);
1179
+ };
1180
+
1181
+ /**
1182
+ * @function writeXObjAttr
1183
+ * @param {object} obj
1184
+ * @param {string} attr
1185
+ * @param {any} value
1186
+ * @param {string} [key]
1187
+ * @returns {boolean}
1188
+ * @throws {TypeError} if first param is not an object
1189
+ * @description Tries to convert a given value to a string
1190
+ * and writes it as an attribute into a given object.
1191
+ */
1192
+ function writeXObjAttr(obj, attr, value, key) {
1193
+ let isSucceed = false;
1194
+ try {
1195
+ const opt = {
1196
+ useTrim: true,
1197
+ numberToString: true,
1198
+ boolToString: true,
1199
+ defValue: '',
1200
+ };
1201
+ isSucceed = writeXObjAttrEx(obj, attr, value, opt, key);
1202
+ } catch (err) {
1203
+ throw err;
1204
+ };
1205
+ return isSucceed;
1206
+ };
1207
+
1208
+ /**
1209
+ * @function writeXObjAttrAsBool
1210
+ * @param {object} obj
1211
+ * @param {string} attr
1212
+ * @param {any} value
1213
+ * @param {boolean} [defValue]
1214
+ * @param {string} [key]
1215
+ * @returns {boolean}
1216
+ * @throws {TypeError} if first param is not an object
1217
+ * @description Tries to convert a given value to a boolean
1218
+ * and writes it as an attribute into a given object.
1219
+ */
1220
+ function writeXObjAttrAsBool(obj, attr, value, defValue, key) {
1221
+ let isSucceed = false;
1222
+ if (value !== undefined || typeof defValue === 'boolean') {
1223
+ const _value = readAsBoolEx(value, defValue).toString();
1224
+ try {
1225
+ isSucceed = writeXObjAttrRaw(obj, attr, _value, key);
1226
+ } catch (err) {
1227
+ switch (err.code) {
1228
+ case XOBJ_TE_NSTR_ECODE : {
1229
+ break;
1230
+ }
1231
+ default: {
1232
+ throw err;
1233
+ }
1234
+ };
1235
+ };
1236
+ };
1237
+ return isSucceed;
1238
+ };
1239
+
1240
+ /**
1241
+ * @function writeXObjAttrAsNum
1242
+ * @param {object} obj
1243
+ * @param {string} attr
1244
+ * @param {any} value
1245
+ * @param {number} [defValue]
1246
+ * @param {string} [key]
1247
+ * @returns {boolean}
1248
+ * @throws {TypeError} if first param is not an object
1249
+ * @description Tries to convert a given value to a number
1250
+ * and writes it as an attribute into a given object.
1251
+ */
1252
+ function writeXObjAttrAsNum(obj, attr, value, defValue, key) {
1253
+ let isSucceed = false;
1254
+ if (value !== undefined || typeof defValue === 'number') {
1255
+ const _value = readAsNumberEx(value, defValue).toString();
1256
+ try {
1257
+ isSucceed = writeXObjAttrRaw(obj, attr, _value, key);
1258
+ } catch (err) {
1259
+ switch (err.code) {
1260
+ case XOBJ_TE_NSTR_ECODE : {
1261
+ break;
1262
+ }
1263
+ default: {
1264
+ throw err;
1265
+ }
1266
+ };
1267
+ };
1268
+ };
1269
+ return isSucceed;
1270
+ };
1271
+
1272
+ /**
1273
+ * @function writeXObjAttrAsIndex
1274
+ * @param {object} obj
1275
+ * @param {string} attr
1276
+ * @param {any} value
1277
+ * @param {string} [key]
1278
+ * @returns {boolean}
1279
+ * @throws {TypeError} if first param is not an object
1280
+ * @description Tries to convert a given value into an 'index' value
1281
+ * and writes it as an attribute into a given object.
1282
+ */
1283
+ function writeXObjAttrAsIndex(obj, attr, value, key) {
1284
+ let isSucceed = false;
1285
+ if (value !== undefined) {
1286
+ const _value = valueToIndex(value).toString();
1287
+ try {
1288
+ isSucceed = writeXObjAttrRaw(obj, attr, _value, key);
1289
+ } catch (err) {
1290
+ switch (err.code) {
1291
+ case XOBJ_TE_NSTR_ECODE : {
1292
+ break;
1293
+ }
1294
+ default: {
1295
+ throw err;
1296
+ }
1297
+ };
1298
+ };
1299
+ };
1300
+ return isSucceed;
1301
+ };
1302
+
1303
+ /**
1304
+ * @function writeXObjAttrEx
1305
+ * @param {object} obj
1306
+ * @param {string} attr
1307
+ * @param {any} value
1308
+ * @param {any} [opt]
1309
+ * @param {string} [key]
1310
+ * @returns {boolean}
1311
+ * @throws {TypeError} if first param is not an object
1312
+ * @description Tries to convert a given value to a string
1313
+ * and writes it as an attribute into a given object.
1314
+ */
1315
+ function writeXObjAttrEx(obj, attr, value, opt, key) {
1316
+ let isSucceed = false;
1317
+ if (value !== undefined) {
1318
+ let _opt = opt;
1319
+ if (!isPlainObject(_opt)) {
1320
+ const defValue = readAsString(_opt, {
1321
+ useTrim: true,
1322
+ numberToString: true,
1323
+ boolToString: true,
1324
+ });
1325
+ _opt = {
1326
+ useTrim: true,
1327
+ numberToString: true,
1328
+ boolToString: true,
1329
+ defValue,
1330
+ };
1331
+ };
1332
+ const _value = readAsString(value, _opt);
1333
+ try {
1334
+ isSucceed = writeXObjAttrRaw(obj, attr, _value, key);
1335
+ } catch (err) {
1336
+ switch (err.code) {
1337
+ case XOBJ_TE_NSTR_ECODE : {
1338
+ break;
1339
+ }
1340
+ default: {
1341
+ throw err;
1342
+ }
1343
+ };
1344
+ };
1345
+ };
1346
+ return isSucceed;
1347
+ };
1348
+
1349
+ /**
1350
+ * @function insertXObjElements
1351
+ * @param {object} obj
1352
+ * @param {...string} name
1353
+ * @param {OPT_inselops_L} [opt]
1354
+ * @returns {number}
1355
+ * @throws {TypeError} if first param is not an object
1356
+ * @description Inserts an elements into a given object.
1357
+ */
1358
+ function insertXObjElements(obj, ...args) {
1359
+ if (!isPlainObject(obj)) {
1360
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
1361
+ err.code = XOBJ_TE_NPOBJ_ECODE;
1362
+ throw err;
1363
+ };
1364
+ let count = 0;
1365
+ let len = args.length;
1366
+ const opt = (
1367
+ len > 0 && isPlainObject(args[len - 1])
1368
+ ? (len--, args.pop())
1369
+ : {}
1370
+ );
1371
+ for (let key of args) {
1372
+ if (insertXObjElement(obj, key, opt) !== null) count++;
1373
+ };
1374
+ return count;
1375
+ };
1376
+
1377
+ /**
1378
+ * typedef OPT_inselops_S
1379
+ * type {object}
1380
+ * @property {boolean} [force=false]
1381
+ * @property {boolean} [ripOldies=false]
1382
+ */
1383
+
1384
+ /**
1385
+ * @function insertXObjEList
1386
+ * @param {object} obj
1387
+ * @param {string} name
1388
+ * @param {OPT_inselops_S} [opt]
1389
+ * @returns {?any}
1390
+ * @throws {TypeError} if first param is not an object
1391
+ * @description Inserts a list elements into a given object.
1392
+ */
1393
+ function insertXObjEList(...args) {
1394
+ let item = null;
1395
+ try {
1396
+ ({ item } = insertXObjEListEx(...args));
1397
+ } catch (err) {
1398
+ switch (err.code) {
1399
+ case XOBJ_TE_NSTR_ECODE :
1400
+ case XOBJ_TE_KNES_ECODE : {
1401
+ break;
1402
+ }
1403
+ default: {
1404
+ throw err;
1405
+ }
1406
+ };
1407
+ };
1408
+ return item;
1409
+ };
1410
+
1411
+ /**
1412
+ * @function insertXObjEListEx
1413
+ * @param {object} obj
1414
+ * @param {string} name
1415
+ * @param {OPT_inselops_S} [opt]
1416
+ * @returns {RVAL_emodif}
1417
+ * @throws {TypeError} if first param is not an object
1418
+ * @throws {TypeError} if second param is empty string or not a string at all
1419
+ * @since 0.2.0
1420
+ * @description Inserts a list elements into a given object.
1421
+ */
1422
+ function insertXObjEListEx(obj, name, opt) {
1423
+ if (!isPlainObject(obj)) {
1424
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
1425
+ err.code = XOBJ_TE_NPOBJ_ECODE;
1426
+ throw err;
1427
+ };
1428
+ let { isSucceed, value: key } = evalKeyName(name);
1429
+ if (!isSucceed) {
1430
+ const { code, msg } = key;
1431
+ const err = new TypeError(msg);
1432
+ err.code = code;
1433
+ throw err;
1434
+ };
1435
+ const _options = isPlainObject(opt) ? opt : {};
1436
+ let { force, ripOldies } = _options;
1437
+ if (typeof force !== 'boolean') force = false;
1438
+ if (typeof ripOldies !== 'boolean') ripOldies = false;
1439
+ let prop = obj[key];
1440
+ isSucceed = false;
1441
+ if (
1442
+ isNullOrUndef(prop)
1443
+ || (force && (ripOldies || !isObject(prop)))
1444
+ ) {
1445
+ obj[key] = prop = [];
1446
+ isSucceed = true;
1447
+ } else {
1448
+ if (isObject(prop)) {
1449
+ if (!isArray(prop)) prop = [ prop ];
1450
+ obj[key] = prop;
1451
+ isSucceed = true;
1452
+ };
1453
+ };
1454
+ return {
1455
+ isSucceed,
1456
+ item: isSucceed ? prop : null,
1457
+ };
1458
+ };
1459
+
1460
+ /**
1461
+ * @function insertXObjEChain
1462
+ * @param {object} obj
1463
+ * @param {...string} name
1464
+ * @param {object} [opt]
1465
+ * @returns {?any}
1466
+ * @throws {TypeError} if first param is not an object
1467
+ * @description Inserts a chain of an elements into a given object.
1468
+ */
1469
+ function insertXObjEChain(obj, ...args){
1470
+ if (!isPlainObject(obj)) {
1471
+ const err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
1472
+ err.code = XOBJ_TE_NPOBJ_ECODE;
1473
+ throw err;
1474
+ };
1475
+ let result = null;
1476
+ let len = args.length;
1477
+ const opt = (
1478
+ len > 0 && isPlainObject(args[len - 1])
1479
+ ? (len--, args.pop())
1480
+ : {}
1481
+ );
1482
+ if (len > 0) {
1483
+ let parent = obj;
1484
+ let child = null;
1485
+ let isSucceed = false;
1486
+ for (let key of args) {
1487
+ child = insertXObjElement(parent, key, opt);
1488
+ isSucceed = isPlainObject(child);
1489
+ if (!isSucceed) break;
1490
+ parent = child;
1491
+ };
1492
+ result = isSucceed ? parent : null;
1493
+ };
1494
+ return result;
1495
+ };
1496
+
1497
+ /***
1498
+ * (* class definitions *)
1499
+ */
1500
+
1501
+ // === module exports block ===
1502
+
1503
+ module.exports.XOBJ_DEF_PARAM_TNAME = XOBJ_DEF_PARAM_TNAME;
1504
+ module.exports.XOBJ_DEF_ATTR_TNAME = XOBJ_DEF_ATTR_TNAME;
1505
+
1506
+ module.exports.readXObjParamRaw = readXObjParamRaw;
1507
+ module.exports.readXObjParam = readXObjParam;
1508
+ module.exports.readXObjParamAsBool = readXObjParamAsBool;
1509
+ module.exports.readXObjParamAsNum = readXObjParamAsNum;
1510
+ module.exports.readXObjParamEx = readXObjParamEx;
1511
+ module.exports.readXObjParamAsIndex = readXObjParamAsIndex;
1512
+ module.exports.writeXObjParamRaw = writeXObjParamRaw;
1513
+ module.exports.writeXObjParam = writeXObjParam;
1514
+ module.exports.writeXObjParamAsBool = writeXObjParamAsBool;
1515
+ module.exports.writeXObjParamAsNum = writeXObjParamAsNum;
1516
+ module.exports.writeXObjParamAsIndex = writeXObjParamAsIndex;
1517
+ module.exports.writeXObjParamEx = writeXObjParamEx;
1518
+
1519
+ module.exports.readXObjAttrRaw = readXObjAttrRaw;
1520
+ module.exports.readXObjAttr = readXObjAttr;
1521
+ module.exports.readXObjAttrAsBool = readXObjAttrAsBool;
1522
+ module.exports.readXObjAttrAsNum = readXObjAttrAsNum;
1523
+ module.exports.readXObjAttrEx = readXObjAttrEx;
1524
+ module.exports.readXObjAttrAsIndex = readXObjAttrAsIndex;
1525
+ module.exports.writeXObjAttrRaw = writeXObjAttrRaw;
1526
+ module.exports.writeXObjAttr = writeXObjAttr;
1527
+ module.exports.writeXObjAttrAsBool = writeXObjAttrAsBool;
1528
+ module.exports.writeXObjAttrAsNum = writeXObjAttrAsNum;
1529
+ module.exports.writeXObjAttrAsIndex = writeXObjAttrAsIndex;
1530
+ module.exports.writeXObjAttrEx = writeXObjAttrEx;
1531
+
1532
+ module.exports.getXObjAttributes = getXObjAttributes;
1533
+ module.exports.checkXObjAttribute = checkXObjAttribute;
1534
+ module.exports.deleteXObjAttribute = deleteXObjAttribute;
1535
+ module.exports.renameXObjAttribute = renameXObjAttribute;
1536
+
1537
+ module.exports.getXObjElement = getXObjElement;
1538
+ module.exports.addXObjElement = addXObjElement;
1539
+ module.exports.insertXObjElement = insertXObjElement;
1540
+ module.exports.insertXObjElementEx = insertXObjElementEx;
1541
+ module.exports.deleteXObjElement = deleteXObjElement;
1542
+ module.exports.deleteXObjElementEx = deleteXObjElementEx;
1543
+ module.exports.renameXObjElement = renameXObjElement;
1544
+
1545
+ module.exports.evalXObjEName = evalXObjEName;
1546
+ module.exports.insertXObjEList = insertXObjEList;
1547
+ module.exports.insertXObjEListEx = insertXObjEListEx;
1548
+
1549
+ /* inner */
1550
+ module.exports.evalKeyName = evalKeyName;
1551
+
1552
+ /* experimental */
1553
+ module.exports.genXObjENameDescr = genXObjENameDescr;
1554
+ /* experimental */
1555
+ module.exports.insertXObjElements = insertXObjElements;
1556
+ /* experimental */
1557
+ module.exports.insertXObjEChain = insertXObjEChain;
1558
+
1559
+ /** @deprecated */
1560
+ module.exports.readXObjParamAsStr = readXObjParamEx;
1561
+ /** @deprecated */
1562
+ module.exports.readXObjAttrAsStr = readXObjAttrEx;