@ygracs/xobj-lib-js 0.0.13 → 0.0.14-rc2

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,10 +1,11 @@
1
- // [v0.1.022-20220822]
1
+ // [v0.1.051-20230227]
2
2
 
3
3
  // === module init block ===
4
4
 
5
5
  const {
6
- valueToIndex, readAsBool, readAsString,
7
- readAsBoolEx, readAsNumberEx, isNotEmptyString, isNullOrUndef,
6
+ valueToIndex,
7
+ readAsString, readAsBoolEx, readAsNumberEx,
8
+ isNullOrUndef,
8
9
  isArray, isObject, isPlainObject, readAsListS,
9
10
  } = require('@ygracs/bsfoc-lib-js');
10
11
 
@@ -12,12 +13,18 @@ const XOBJ_DEF_PARAM_TNAME = '__text';
12
13
  const XOBJ_DEF_ATTR_TNAME = '__attr';
13
14
 
14
15
  const XOBJ_TE_INVARG_EMSG = 'invalid argument';
15
- const XOBJ_TE_NOBJ_EMSG = XOBJ_TE_INVARG_EMSG + '(an object is expected)';
16
- const XOBJ_TE_NARR_EMSG = XOBJ_TE_INVARG_EMSG + '(an array is expected)';
17
- const XOBJ_TE_NSTR_EMSG = XOBJ_TE_INVARG_EMSG + '(a string is expected)';
18
- const XOBJ_TE_NPOBJ_EMSG = XOBJ_TE_INVARG_EMSG + '(a plain object is expected)';
16
+ const XOBJ_TE_NOBJ_EMSG = `${XOBJ_TE_INVARG_EMSG} (an object expected)`;
17
+ const XOBJ_TE_NOBJ_ECODE = 'ERR_XOBJ_NOBJ';
18
+ const XOBJ_TE_NARR_EMSG = `${XOBJ_TE_INVARG_EMSG} (an array expected)`;
19
+ const XOBJ_TE_NARR_ECODE = 'ERR_XOBJ_NARR';
20
+ const XOBJ_TE_NSTR_EMSG = `${XOBJ_TE_INVARG_EMSG} (a string expected)`;
21
+ const XOBJ_TE_NSTR_ECODE = 'ERR_XOBJ_NSTR';
22
+ const XOBJ_TE_NPOBJ_EMSG = `${XOBJ_TE_INVARG_EMSG} (a plain object expected)`;
23
+ const XOBJ_TE_NPOBJ_ECODE = 'ERR_XOBJ_NPOBJ';
19
24
  const XOBJ_TE_ANES_EMSG = '<attr_name> must be a non-empty string';
25
+ const XOBJ_TE_ANES_ECODE = 'ERR_XOBJ_INVARG_ATTR';
20
26
  const XOBJ_TE_KNES_EMSG = '<key_name> must be a non-empty string';
27
+ const XOBJ_TE_KNES_ECODE = 'ERR_XOBJ_INVARG_KEY';
21
28
 
22
29
  const DEF_XML_PARSE_OPTIONS = {
23
30
  compact: true,
@@ -46,74 +53,174 @@ const DEF_XML_PARSE_OPTIONS = {
46
53
 
47
54
  // === module main block (function definitions) ===
48
55
 
49
- function getXObjElement(obj, name){
50
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
51
- const key = typeof name === 'string' ? name.trim() : '';
52
- if (key === '') throw new TypeError(XOBJ_TE_KNES_EMSG);
53
- // TODO: check type of obj[key_name]
54
- return obj[key] !== undefined ? obj[key] : null;
56
+ function evalXObjEName(value){
57
+ let name = value;
58
+ if (!isNullOrUndef(name)) {
59
+ switch (typeof name) {
60
+ case 'number' : {
61
+ if (Number.isNaN(name) || name < 0) name = null;
62
+ break;
63
+ }
64
+ case 'string' : {
65
+ name = name.trim();
66
+ if (name !== '') {
67
+ let value = Number(name);
68
+ if (!Number.isNaN(value)) {
69
+ name = value < 0 ? null : value;
70
+ };
71
+ };
72
+ break;
73
+ }
74
+ default: {
75
+ name = null;
76
+ break;
77
+ }
78
+ };
79
+ };
80
+ return name;
55
81
  };
56
82
 
57
- function getXObjAttributes(obj, key_name = XOBJ_DEF_ATTR_TNAME){
58
- return getXObjElement(obj, readAsString(key_name, XOBJ_DEF_ATTR_TNAME, true));
83
+ function getXObjElement(obj, name){
84
+ let err = null;
85
+ if (!isPlainObject(obj)) {
86
+ err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
87
+ err.code = XOBJ_TE_NPOBJ_ECODE;
88
+ throw err;
89
+ };
90
+ if (typeof name !== 'string') {
91
+ err = new TypeError(XOBJ_TE_NSTR_EMSG);
92
+ err.code = XOBJ_TE_NSTR_ECODE;
93
+ throw err;
94
+ };
95
+ const key = name.trim();
96
+ if (key === '') {
97
+ err = new TypeError(XOBJ_TE_KNES_EMSG);
98
+ err.code = XOBJ_TE_KNES_ECODE;
99
+ throw err;
100
+ };
101
+ // TODO: [?] check type of obj[key_name]
102
+ return obj[key] !== undefined ? obj[key] : null;
59
103
  };
60
104
 
61
- function insertXObjElement(obj, name, opt){
62
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
63
- const key = typeof name === 'string' ? name.trim() : '';
64
- if (key === '') throw new TypeError(XOBJ_TE_KNES_EMSG);
65
- let force_act = false;
66
- let rip_oldies = false;
67
- if (typeof opt === 'boolean') {
68
- force_act = opt;
69
- } else if (isPlainObject(opt)) {
70
- force_act = readAsBool(opt.force, false);
71
- if (force_act) rip_oldies = readAsBool(opt.rip_oldies, false);
72
- };
73
- let isACCEPTED = false;
74
- if (isNullOrUndef(obj[key])) {
75
- obj[key] = {};
76
- isACCEPTED = true;
77
- } else if (force_act) {
78
- if (rip_oldies || !isPlainObject(obj[key])) obj[key] = {};
79
- isACCEPTED = true;
80
- } else {
81
- isACCEPTED = isPlainObject(obj[key]);
105
+ function getXObjAttributes(obj, key = XOBJ_DEF_ATTR_TNAME){
106
+ let result = null;
107
+ try {
108
+ result = getXObjElement(obj, key);
109
+ } catch (err) {
110
+ switch (err.code) {
111
+ case XOBJ_TE_NSTR_ECODE :
112
+ case XOBJ_TE_KNES_ECODE : {
113
+ break;
114
+ }
115
+ default: {
116
+ throw err;
117
+ break;
118
+ }
119
+ };
82
120
  };
83
- return isACCEPTED ? obj[key] : null;
121
+ return isPlainObject(result) ? result : null;
84
122
  };
85
123
 
86
124
  function addXObjElement(obj, name){
87
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
88
- const key = typeof name === 'string' ? name.trim() : '';
89
- if (key === '') throw new TypeError(XOBJ_TE_KNES_EMSG);
125
+ let err = null;
126
+ if (!isPlainObject(obj)) {
127
+ err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
128
+ err.code = XOBJ_TE_NPOBJ_ECODE;
129
+ throw err;
130
+ };
131
+ if (typeof name !== 'string') {
132
+ err = new TypeError(XOBJ_TE_NSTR_EMSG);
133
+ err.code = XOBJ_TE_NSTR_ECODE;
134
+ throw err;
135
+ };
136
+ const key = name.trim();
137
+ if (key === '') {
138
+ err = new TypeError(XOBJ_TE_KNES_EMSG);
139
+ err.code = XOBJ_TE_KNES_ECODE;
140
+ throw err;
141
+ };
142
+ const item = {};
90
143
  let prop = obj[key];
91
- let item = {};
92
- let result = false;
93
- // // TODO: consider wheter or not do ops if new_key exists
144
+ let isSUCCEED = false;
145
+ // // TODO: [?] consider wheter or not do ops if new_key exists
94
146
  if (isNullOrUndef(prop)) {
95
- obj[key] = {};
96
- prop = obj[key];
97
- result = true;
98
- } else if (isPlainObject(prop)) {
99
- obj[key] = [ prop, item ];
100
- prop = item;
101
- result = true;
102
- } else if (isArray(prop)) {
103
- prop.push(item);
104
- prop = item;
105
- result = true;
147
+ obj[key] = prop = item;
148
+ isSUCCEED = true;
149
+ } else if (isObject(prop)) {
150
+ isSUCCEED = true;
151
+ if (isArray(prop)) {
152
+ prop.push(item);
153
+ prop = item;
154
+ } else {
155
+ obj[key] = [ prop, item ];
156
+ prop = item;
157
+ };
106
158
  };
107
159
  return {
108
- isSucceed: result,
109
- item: result ? prop : null,
160
+ isSucceed: isSUCCEED,
161
+ item: isSUCCEED ? prop : null,
162
+ };
163
+ };
164
+
165
+ function insertXObjElement(obj, name, opt){
166
+ let err = null;
167
+ if (!isPlainObject(obj)) {
168
+ err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
169
+ err.code = XOBJ_TE_NPOBJ_ECODE;
170
+ throw err;
171
+ };
172
+ if (typeof name !== 'string') {
173
+ err = new TypeError(XOBJ_TE_NSTR_EMSG);
174
+ err.code = XOBJ_TE_NSTR_ECODE;
175
+ throw err;
176
+ };
177
+ const key = name.trim();
178
+ if (key === '') {
179
+ err = new TypeError(XOBJ_TE_KNES_EMSG);
180
+ err.code = XOBJ_TE_KNES_ECODE;
181
+ throw err;
110
182
  };
183
+ let _options = opt;
184
+ if (typeof opt === 'boolean') {
185
+ _options = { force: _options };
186
+ } else if (!isPlainObject(_options)) {
187
+ _options = {};
188
+ };
189
+ let { force, rip_oldies, ripOldies } = _options;
190
+ if (typeof force !== 'boolean') force = false;
191
+ if (ripOldies === undefined) ripOldies = rip_oldies;
192
+ if (typeof ripOldies !== 'boolean') ripOldies = false;
193
+ let prop = obj[key];
194
+ let isACCEPTED = (
195
+ isNullOrUndef(prop)
196
+ || (force && (ripOldies || !isPlainObject(prop)))
197
+ );
198
+ if (isACCEPTED) {
199
+ obj[key] = prop = {};
200
+ } else {
201
+ isACCEPTED = isPlainObject(prop);
202
+ };
203
+ return isACCEPTED ? prop : null;
111
204
  };
112
205
 
113
206
  function deleteXObjElement(obj, name){
114
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
115
- const key = typeof name === 'string' ? name.trim() : '';
116
- if (key === '') throw new TypeError(XOBJ_TE_KNES_EMSG);
207
+ let err = null;
208
+ if (!isPlainObject(obj)) {
209
+ err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
210
+ err.code = XOBJ_TE_NPOBJ_ECODE;
211
+ throw err;
212
+ };
213
+ if (typeof name !== 'string') {
214
+ err = new TypeError(XOBJ_TE_NSTR_EMSG);
215
+ err.code = XOBJ_TE_NSTR_ECODE;
216
+ throw err;
217
+ };
218
+ const key = name.trim();
219
+ if (key === '') {
220
+ err = new TypeError(XOBJ_TE_KNES_EMSG);
221
+ err.code = XOBJ_TE_KNES_ECODE;
222
+ throw err;
223
+ };
117
224
  let result = false;
118
225
  // // TODO: catch errors in strict mode
119
226
  result = delete obj[key];
@@ -121,9 +228,23 @@ function deleteXObjElement(obj, name){
121
228
  };
122
229
 
123
230
  function deleteXObjElementEx(obj, name){
124
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
125
- const key = typeof name === 'string' ? name.trim() : '';
126
- if (key === '') throw new TypeError(XOBJ_TE_KNES_EMSG);
231
+ let err = null;
232
+ if (!isPlainObject(obj)) {
233
+ err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
234
+ err.code = XOBJ_TE_NPOBJ_ECODE;
235
+ throw err;
236
+ };
237
+ if (typeof name !== 'string') {
238
+ err = new TypeError(XOBJ_TE_NSTR_EMSG);
239
+ err.code = XOBJ_TE_NSTR_ECODE;
240
+ throw err;
241
+ };
242
+ const key = name.trim();
243
+ if (key === '') {
244
+ err = new TypeError(XOBJ_TE_KNES_EMSG);
245
+ err.code = XOBJ_TE_KNES_ECODE;
246
+ throw err;
247
+ };
127
248
  let prop = obj[key];
128
249
  let result = false;
129
250
  // // TODO: catch errors in strict mode
@@ -135,16 +256,29 @@ function deleteXObjElementEx(obj, name){
135
256
  };
136
257
 
137
258
  function renameXObjElement(obj, name, newName){
138
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
139
- const key = typeof name === 'string' ? name.trim() : '';
140
- if (key === '') throw new TypeError(XOBJ_TE_KNES_EMSG);
141
- const newKey = typeof newName === 'string' ? newName.trim() : '';
142
- if (newKey === '') throw new TypeError(XOBJ_TE_KNES_EMSG);
143
- let prop = obj[key];
259
+ let err = null;
260
+ if (!isPlainObject(obj)) {
261
+ err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
262
+ err.code = XOBJ_TE_NPOBJ_ECODE;
263
+ throw err;
264
+ };
265
+ if (typeof name !== 'string' || typeof newName !== 'string') {
266
+ err = new TypeError(XOBJ_TE_NSTR_EMSG);
267
+ err.code = XOBJ_TE_NSTR_ECODE;
268
+ throw err;
269
+ };
270
+ const key = name.trim();
271
+ const newKey = newName.trim();
272
+ if (key === '' || newKey === '') {
273
+ err = new TypeError(XOBJ_TE_KNES_EMSG);
274
+ err.code = XOBJ_TE_KNES_ECODE;
275
+ throw err;
276
+ };
277
+ const prop = obj[key];
144
278
  let result = false;
145
- // // TODO: consider wheter or not do ops if new_key exists
146
279
  if (prop !== undefined) {
147
- if (key === newKey) return isObject(prop) ? true : false;
280
+ if (key === newKey) return isObject(prop);
281
+ // // TODO: consider wheter or not do ops if new_key exists
148
282
  // // TODO: catch errors in strict mode
149
283
  result = delete obj[key];
150
284
  if (result) {
@@ -154,252 +288,650 @@ function renameXObjElement(obj, name, newName){
154
288
  return result;
155
289
  };
156
290
 
157
- function readXObjParamRaw(obj, key_name = XOBJ_DEF_PARAM_TNAME){
158
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
159
- key_name = readAsString(key_name, XOBJ_DEF_PARAM_TNAME, true);
160
- return isNotEmptyString(key_name) ? obj[key_name] : undefined;
291
+ function checkXObjAttribute(obj, attr = '', key){
292
+ if (typeof attr !== 'string') {
293
+ let err = new TypeError(XOBJ_TE_NSTR_EMSG);
294
+ err.code = XOBJ_TE_NSTR_ECODE;
295
+ throw err;
296
+ };
297
+ let objAttr = null;
298
+ try {
299
+ objAttr = getXObjAttributes(obj, key);
300
+ } catch (err) {
301
+ throw err;
302
+ };
303
+ const attrName = attr.trim();
304
+ let result = false;
305
+ if (
306
+ objAttr !== null
307
+ && attrName !== ''
308
+ && objAttr[attrName] !== undefined
309
+ ) {
310
+ result = true;
311
+ };
312
+ return result;
313
+ };
314
+
315
+ function deleteXObjAttribute(obj, attr = '', key){
316
+ if (typeof attr !== 'string') {
317
+ let err = new TypeError(XOBJ_TE_NSTR_EMSG);
318
+ err.code = XOBJ_TE_NSTR_ECODE;
319
+ throw err;
320
+ };
321
+ let objAttr = null;
322
+ try {
323
+ objAttr = getXObjAttributes(obj, key);
324
+ } catch (err) {
325
+ throw err;
326
+ };
327
+ const attrName = attr.trim();
328
+ let result = false;
329
+ if (objAttr !== null && attrName !== '') {
330
+ // // TODO: catch errors in strict mode
331
+ result = delete objAttr[attrName];
332
+ };
333
+ return result;
334
+ };
335
+
336
+ function readXObjParamRaw(obj, key = XOBJ_DEF_PARAM_TNAME){
337
+ let err = null;
338
+ if (!isPlainObject(obj)) {
339
+ err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
340
+ err.code = XOBJ_TE_NPOBJ_ECODE;
341
+ throw err;
342
+ };
343
+ if (typeof key !== 'string') {
344
+ err = new TypeError(XOBJ_TE_NSTR_EMSG);
345
+ err.code = XOBJ_TE_NSTR_ECODE;
346
+ throw err;
347
+ };
348
+ const _key = key.trim();
349
+ return _key !== '' ? obj[_key] : undefined;
161
350
  };
162
351
 
163
- function writeXObjParamRaw(obj, value, key_name = XOBJ_DEF_PARAM_TNAME){
164
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
165
- key_name = readAsString(key_name, XOBJ_DEF_PARAM_TNAME, true);
166
- let isACCEPTED = isNotEmptyString(key_name);
167
- if (isACCEPTED) obj[key_name] = value;
168
- return isACCEPTED;
352
+ function writeXObjParamRaw(obj, value, key = XOBJ_DEF_PARAM_TNAME){
353
+ let err = null;
354
+ if (!isPlainObject(obj)) {
355
+ err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
356
+ err.code = XOBJ_TE_NPOBJ_ECODE;
357
+ throw err;
358
+ };
359
+ if (typeof key !== 'string') {
360
+ err = new TypeError(XOBJ_TE_NSTR_EMSG);
361
+ err.code = XOBJ_TE_NSTR_ECODE;
362
+ throw err;
363
+ };
364
+ const _key = key.trim();
365
+ let isSUCCEED = false;
366
+ if (_key !== '' && value !== undefined){
367
+ obj[_key] = value;
368
+ isSUCCEED = true;
369
+ };
370
+ return isSUCCEED;
169
371
  };
170
372
 
171
- function readXObjAttrRaw(obj, attr, key_name = XOBJ_DEF_ATTR_TNAME){
172
- const attrName = typeof attr === 'string' ? attr.trim() : '';
173
- if (attrName === '') throw new TypeError(XOBJ_TE_ANES_EMSG);
174
- obj = getXObjElement(obj, readAsString(key_name, XOBJ_DEF_ATTR_TNAME, true));
175
- return isPlainObject(obj) ? obj[attrName] : undefined ;
373
+ function readXObjAttrRaw(obj, attr = '', key){
374
+ if (typeof attr !== 'string') {
375
+ let err = new TypeError(XOBJ_TE_NSTR_EMSG);
376
+ err.code = XOBJ_TE_NSTR_ECODE;
377
+ throw err;
378
+ };
379
+ let objAttr = null;
380
+ try {
381
+ objAttr = getXObjAttributes(obj, key);
382
+ } catch (err) {
383
+ throw err;
384
+ };
385
+ const attrName = attr.trim();
386
+ if (objAttr !== null && attrName !== '') return objAttr[attrName];
176
387
  };
177
388
 
178
- function writeXObjAttrRaw(obj, attr, value, key_name = XOBJ_DEF_ATTR_TNAME){
179
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
180
- const attrName = typeof attr === 'string' ? attr.trim() : '';
181
- if (attrName === '') throw new TypeError(XOBJ_TE_ANES_EMSG);
182
- key_name = readAsString(key_name, XOBJ_DEF_ATTR_TNAME, true);
183
- let isACCEPTED = isNotEmptyString(key_name);
184
- if (isACCEPTED) {
185
- if (!isPlainObject(obj[key_name])) obj[key_name] = {};
186
- obj[key_name][attrName] = value;
389
+ function writeXObjAttrRaw(obj, attr = '', value, key = XOBJ_DEF_ATTR_TNAME){
390
+ if (typeof attr !== 'string') {
391
+ let err = new TypeError(XOBJ_TE_NSTR_EMSG);
392
+ err.code = XOBJ_TE_NSTR_ECODE;
393
+ throw err;
394
+ };
395
+ const attrName = attr.trim();
396
+ let objAttr = null;
397
+ let isSUCCEED = false;
398
+ if (attrName !== '' && value !== undefined) {
399
+ try {
400
+ objAttr = insertXObjElement(obj, key, { force: true });
401
+ } catch (err) {
402
+ switch (err.code) {
403
+ case XOBJ_TE_NSTR_ECODE :
404
+ case XOBJ_TE_KNES_ECODE : {
405
+ break;
406
+ }
407
+ default: {
408
+ throw err;
409
+ break;
410
+ }
411
+ };
412
+ };
413
+ if (objAttr !== null) {
414
+ objAttr[attrName] = value;
415
+ isSUCCEED = true;
416
+ };
187
417
  };
188
- return isACCEPTED;
418
+ return isSUCCEED;
189
419
  };
190
420
 
191
- function readXObjParam(obj, defKey){
192
- const param = readXObjParamRaw(obj, defKey);
193
- return readAsString(param, {
421
+ function readXObjParam(obj, key){
422
+ let result = undefined;
423
+ try {
424
+ result = readXObjParamRaw(obj, key);
425
+ } catch (err) {
426
+ switch (err.code) {
427
+ case XOBJ_TE_NSTR_ECODE : {
428
+ break;
429
+ }
430
+ default: {
431
+ throw err;
432
+ break;
433
+ }
434
+ };
435
+ };
436
+ return readAsString(result, {
194
437
  useTrim: false,
195
438
  numberToString: true,
196
439
  boolToString: true,
197
440
  });
198
441
  };
199
442
 
200
- function readXObjParamAsBool(obj, defValue = false, defKey){
201
- const param = readXObjParamRaw(obj, defKey);
202
- return readAsBoolEx(param, defValue);
443
+ function readXObjParamAsBool(obj, defValue, key){
444
+ let result = undefined;
445
+ try {
446
+ result = readXObjParamRaw(obj, key);
447
+ } catch (err) {
448
+ switch (err.code) {
449
+ case XOBJ_TE_NSTR_ECODE : {
450
+ break;
451
+ }
452
+ default: {
453
+ throw err;
454
+ break;
455
+ }
456
+ };
457
+ };
458
+ return readAsBoolEx(result, defValue);
203
459
  };
204
460
 
205
- function readXObjParamAsNum(obj, defValue = 0, defKey){
206
- const param = readXObjParamRaw(obj, defKey);
207
- return readAsNumberEx(param, defValue);
461
+ function readXObjParamAsNum(obj, defValue, key){
462
+ let result = undefined;
463
+ try {
464
+ result = readXObjParamRaw(obj, key);
465
+ } catch (err) {
466
+ switch (err.code) {
467
+ case XOBJ_TE_NSTR_ECODE : {
468
+ break;
469
+ }
470
+ default: {
471
+ throw err;
472
+ break;
473
+ }
474
+ };
475
+ };
476
+ return readAsNumberEx(result, defValue);
208
477
  };
209
478
 
210
- function readXObjParamAsStr(obj, defValue = '', defKey){
211
- const param = readXObjParamRaw(obj, defKey);
212
- return readAsString(param, defValue, {
479
+ function readXObjParamAsStr(obj, defValue, key){
480
+ let result = undefined;
481
+ try {
482
+ result = readXObjParamRaw(obj, key);
483
+ } catch (err) {
484
+ switch (err.code) {
485
+ case XOBJ_TE_NSTR_ECODE : {
486
+ break;
487
+ }
488
+ default: {
489
+ throw err;
490
+ break;
491
+ }
492
+ };
493
+ };
494
+ return readAsString(result, defValue, {
213
495
  useTrim: false,
214
496
  numberToString: true,
215
497
  boolToString: true,
216
498
  });
217
499
  };
218
500
 
219
- function readXObjParamAsIndex(obj, defKey){
220
- return valueToIndex(readXObjParamRaw(obj, defKey));
501
+ function readXObjParamAsIndex(obj, key){
502
+ let result = undefined;
503
+ try {
504
+ result = readXObjParamRaw(obj, key);
505
+ } catch (err) {
506
+ switch (err.code) {
507
+ case XOBJ_TE_NSTR_ECODE : {
508
+ break;
509
+ }
510
+ default: {
511
+ throw err;
512
+ break;
513
+ }
514
+ };
515
+ };
516
+ return valueToIndex(result);
221
517
  };
222
518
 
223
- function writeXObjParam(obj, value, defKey){
224
- const _value = readAsString(value, {
225
- useTrim: false,
226
- numberToString: true,
227
- boolToString: true,
228
- });
229
- return writeXObjParamRaw(obj, _value, defKey);
519
+ function writeXObjParam(obj, value, key){
520
+ let isSUCCEED = false;
521
+ if (value !== undefined) {
522
+ const _value = readAsString(value, {
523
+ useTrim: false,
524
+ numberToString: true,
525
+ boolToString: true,
526
+ });
527
+ try {
528
+ isSUCCEED = writeXObjParamRaw(obj, _value, key);
529
+ } catch (err) {
530
+ switch (err.code) {
531
+ case XOBJ_TE_NSTR_ECODE : {
532
+ break;
533
+ }
534
+ default: {
535
+ throw err;
536
+ break;
537
+ }
538
+ };
539
+ };
540
+ };
541
+ return isSUCCEED;
230
542
  };
231
543
 
232
- function writeXObjParamAsBool(obj, value, defValue = false, defKey){
233
- const _value = readAsBoolEx(value, defValue).toString();
234
- return writeXObjParamRaw(obj, _value, defKey);
544
+ function writeXObjParamAsBool(obj, value, defValue, key){
545
+ let isSUCCEED = false;
546
+ if (value !== undefined) {
547
+ const _value = readAsBoolEx(value, defValue).toString();
548
+ try {
549
+ isSUCCEED = writeXObjParamRaw(obj, _value, key);
550
+ } catch (err) {
551
+ switch (err.code) {
552
+ case XOBJ_TE_NSTR_ECODE : {
553
+ break;
554
+ }
555
+ default: {
556
+ throw err;
557
+ break;
558
+ }
559
+ };
560
+ };
561
+ };
562
+ return isSUCCEED;
235
563
  };
236
564
 
237
- function writeXObjParamAsNum(obj, value, defValue = 0, defKey){
238
- const _value = readAsNumberEx(value, defValue).toString();
239
- return writeXObjParamRaw(obj, _value, defKey);
565
+ function writeXObjParamAsNum(obj, value, defValue, key){
566
+ let isSUCCEED = false;
567
+ if (value !== undefined) {
568
+ const _value = readAsNumberEx(value, defValue).toString();
569
+ try {
570
+ isSUCCEED = writeXObjParamRaw(obj, _value, key);
571
+ } catch (err) {
572
+ switch (err.code) {
573
+ case XOBJ_TE_NSTR_ECODE : {
574
+ break;
575
+ }
576
+ default: {
577
+ throw err;
578
+ break;
579
+ }
580
+ };
581
+ };
582
+ };
583
+ return isSUCCEED;
240
584
  };
241
585
 
242
- function writeXObjParamAsIndex(obj, value, defKey){
243
- const _value = valueToIndex(value).toString();
244
- return writeXObjParamRaw(obj, _value, defKey);
586
+ function writeXObjParamAsIndex(obj, value, key){
587
+ let isSUCCEED = false;
588
+ if (value !== undefined) {
589
+ const _value = valueToIndex(value).toString();
590
+ try {
591
+ isSUCCEED = writeXObjParamRaw(obj, _value, key);
592
+ } catch (err) {
593
+ switch (err.code) {
594
+ case XOBJ_TE_NSTR_ECODE : {
595
+ break;
596
+ }
597
+ default: {
598
+ throw err;
599
+ break;
600
+ }
601
+ };
602
+ };
603
+ };
604
+ return isSUCCEED;
245
605
  };
246
606
 
247
- function writeXObjParamEx(obj, value, defValue, defKey){
248
- const _defValue = readAsString(defValue, {
249
- useTrim: false,
250
- numberToString: true,
251
- boolToString: true,
252
- });
253
- const _value = readAsString(value, _defValue, {
254
- useTrim: false,
255
- numberToString: true,
256
- boolToString: true,
257
- });
258
- return writeXObjParamRaw(obj, _value, defKey);
607
+ function writeXObjParamEx(obj, value, defValue, key){
608
+ let isSUCCEED = false;
609
+ if (value !== undefined) {
610
+ const _defValue = readAsString(defValue, {
611
+ useTrim: false,
612
+ numberToString: true,
613
+ boolToString: true,
614
+ });
615
+ const _value = readAsString(value, _defValue, {
616
+ useTrim: false,
617
+ numberToString: true,
618
+ boolToString: true,
619
+ });
620
+ try {
621
+ isSUCCEED = writeXObjParamRaw(obj, _value, key);
622
+ } catch (err) {
623
+ switch (err.code) {
624
+ case XOBJ_TE_NSTR_ECODE : {
625
+ break;
626
+ }
627
+ default: {
628
+ throw err;
629
+ break;
630
+ }
631
+ };
632
+ };
633
+ };
634
+ return isSUCCEED;
259
635
  };
260
636
 
261
- function readXObjAttr(obj, name, defKey){
262
- const param = readXObjAttrRaw(obj, name, defKey);
263
- return readAsString(param, {
637
+ function readXObjAttr(obj, attr, key){
638
+ let result = undefined;
639
+ try {
640
+ result = readXObjAttrRaw(obj, attr, key);
641
+ } catch (err) {
642
+ switch (err.code) {
643
+ case XOBJ_TE_NSTR_ECODE : {
644
+ break;
645
+ }
646
+ default: {
647
+ throw err;
648
+ break;
649
+ }
650
+ };
651
+ };
652
+ return readAsString(result, {
264
653
  useTrim: true,
265
654
  numberToString: true,
266
655
  boolToString: true,
267
656
  });
268
657
  };
269
658
 
270
- function readXObjAttrAsBool(obj, name, defValue = false, defKey){
271
- const param = readXObjAttrRaw(obj, name, defKey);
272
- return readAsBoolEx(param, defValue);
659
+ function readXObjAttrAsBool(obj, attr, defValue, key){
660
+ let result = undefined;
661
+ try {
662
+ result = readXObjAttrRaw(obj, attr, key);
663
+ } catch (err) {
664
+ switch (err.code) {
665
+ case XOBJ_TE_NSTR_ECODE : {
666
+ break;
667
+ }
668
+ default: {
669
+ throw err;
670
+ break;
671
+ }
672
+ };
673
+ };
674
+ return readAsBoolEx(result, defValue);
273
675
  };
274
676
 
275
- function readXObjAttrAsNum(obj, name, defValue = 0, defKey){
276
- const param = readXObjAttrRaw(obj, name, defKey);
277
- return readAsNumberEx(param, defValue);
677
+ function readXObjAttrAsNum(obj, attr, defValue, key){
678
+ let result = undefined;
679
+ try {
680
+ result = readXObjAttrRaw(obj, attr, key);
681
+ } catch (err) {
682
+ switch (err.code) {
683
+ case XOBJ_TE_NSTR_ECODE : {
684
+ break;
685
+ }
686
+ default: {
687
+ throw err;
688
+ break;
689
+ }
690
+ };
691
+ };
692
+ return readAsNumberEx(result, defValue);
278
693
  };
279
694
 
280
- function readXObjAttrAsStr(obj, name, defValue = '', defKey){
281
- const param = readXObjAttrRaw(obj, name, defKey);
282
- return readAsString(param, defValue, {
695
+ function readXObjAttrAsStr(obj, attr, defValue, key){
696
+ let result = undefined;
697
+ try {
698
+ result = readXObjAttrRaw(obj, attr, key);
699
+ } catch (err) {
700
+ switch (err.code) {
701
+ case XOBJ_TE_NSTR_ECODE : {
702
+ break;
703
+ }
704
+ default: {
705
+ throw err;
706
+ break;
707
+ }
708
+ };
709
+ };
710
+ return readAsString(result, defValue, {
283
711
  useTrim: true,
284
712
  numberToString: true,
285
713
  boolToString: true,
286
714
  });
287
715
  };
288
716
 
289
- function readXObjAttrAsIndex(obj, name, defKey){
290
- return valueToIndex(readXObjAttrRaw(obj, name, defKey));
717
+ function readXObjAttrAsIndex(obj, attr, key){
718
+ let result = undefined;
719
+ try {
720
+ result = readXObjAttrRaw(obj, attr, key);
721
+ } catch (err) {
722
+ switch (err.code) {
723
+ case XOBJ_TE_NSTR_ECODE : {
724
+ break;
725
+ }
726
+ default: {
727
+ throw err;
728
+ break;
729
+ }
730
+ };
731
+ };
732
+ return valueToIndex(result);
291
733
  };
292
734
 
293
- function writeXObjAttr(obj, name, value, defKey){
294
- const _value = readAsString(value, {
295
- useTrim: true,
296
- numberToString: true,
297
- boolToString: true,
298
- });
299
- return writeXObjAttrRaw(obj, name, _value, defKey);
735
+ function writeXObjAttr(obj, attr, value, key){
736
+ let isSUCCEED = false;
737
+ if (value !== undefined) {
738
+ const _value = readAsString(value, {
739
+ useTrim: true,
740
+ numberToString: true,
741
+ boolToString: true,
742
+ });
743
+ try {
744
+ isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
745
+ } catch (err) {
746
+ switch (err.code) {
747
+ case XOBJ_TE_NSTR_ECODE : {
748
+ break;
749
+ }
750
+ default: {
751
+ throw err;
752
+ break;
753
+ }
754
+ };
755
+ };
756
+ };
757
+ return isSUCCEED;
300
758
  };
301
759
 
302
- function writeXObjAttrAsBool(obj, name, value, defValue = false, defKey){
303
- const _value = readAsBoolEx(value, defValue).toString();
304
- return writeXObjAttrRaw(obj, name, _value, defKey);
760
+ function writeXObjAttrAsBool(obj, attr, value, defValue, key){
761
+ let isSUCCEED = false;
762
+ if (value !== undefined) {
763
+ const _value = readAsBoolEx(value, defValue).toString();
764
+ try {
765
+ isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
766
+ } catch (err) {
767
+ switch (err.code) {
768
+ case XOBJ_TE_NSTR_ECODE : {
769
+ break;
770
+ }
771
+ default: {
772
+ throw err;
773
+ break;
774
+ }
775
+ };
776
+ };
777
+ };
778
+ return isSUCCEED;
305
779
  };
306
780
 
307
- function writeXObjAttrAsNum(obj, name, value, defValue = 0, defKey){
308
- const _value = readAsNumberEx(value, defValue).toString();
309
- return writeXObjAttrRaw(obj, name, _value, defKey);
781
+ function writeXObjAttrAsNum(obj, attr, value, defValue, key){
782
+ let isSUCCEED = false;
783
+ if (value !== undefined) {
784
+ const _value = readAsNumberEx(value, defValue).toString();
785
+ try {
786
+ isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
787
+ } catch (err) {
788
+ switch (err.code) {
789
+ case XOBJ_TE_NSTR_ECODE : {
790
+ break;
791
+ }
792
+ default: {
793
+ throw err;
794
+ break;
795
+ }
796
+ };
797
+ };
798
+ };
799
+ return isSUCCEED;
310
800
  };
311
801
 
312
- function writeXObjAttrAsIndex(obj, name, value, defKey){
313
- const _value = valueToIndex(value).toString();
314
- return writeXObjAttrRaw(obj, name, _value, defKey);
802
+ function writeXObjAttrAsIndex(obj, attr, value, key){
803
+ let isSUCCEED = false;
804
+ if (value !== undefined) {
805
+ const _value = valueToIndex(value).toString();
806
+ try {
807
+ isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
808
+ } catch (err) {
809
+ switch (err.code) {
810
+ case XOBJ_TE_NSTR_ECODE : {
811
+ break;
812
+ }
813
+ default: {
814
+ throw err;
815
+ break;
816
+ }
817
+ };
818
+ };
819
+ };
820
+ return isSUCCEED;
315
821
  };
316
822
 
317
- function writeXObjAttrEx(obj, name, value, defValue, defKey){
318
- const _defValue = readAsString(defValue, {
319
- useTrim: true,
320
- numberToString: true,
321
- boolToString: true,
322
- });
323
- const _value = readAsString(value, _defValue, {
324
- useTrim: true,
325
- numberToString: true,
326
- boolToString: true,
327
- });
328
- return writeXObjAttrRaw(obj, name, _value, defKey);
823
+ function writeXObjAttrEx(obj, attr, value, defValue, key){
824
+ let isSUCCEED = false;
825
+ if (value !== undefined) {
826
+ const _defValue = readAsString(defValue, {
827
+ useTrim: true,
828
+ numberToString: true,
829
+ boolToString: true,
830
+ });
831
+ const _value = readAsString(value, _defValue, {
832
+ useTrim: true,
833
+ numberToString: true,
834
+ boolToString: true,
835
+ });
836
+ try {
837
+ isSUCCEED = writeXObjAttrRaw(obj, attr, _value, key);
838
+ } catch (err) {
839
+ switch (err.code) {
840
+ case XOBJ_TE_NSTR_ECODE : {
841
+ break;
842
+ }
843
+ default: {
844
+ throw err;
845
+ break;
846
+ }
847
+ };
848
+ };
849
+ };
850
+ return isSUCCEED;
329
851
  };
330
852
 
331
853
  function insertXObjElements(obj, ...args){
332
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
333
- let opt = {};
334
- let count = 0;
335
- let args_len = args.length;
336
- if (args_len > 0) {
337
- let pos = args_len-1;
338
- if (typeof args[pos] === 'boolean') {
339
- opt.force = args.pop();
340
- } else if (isPlainObject(args[pos])) {
341
- opt = args.pop();
342
- };
854
+ if (!isPlainObject(obj)) {
855
+ let err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
856
+ err.code = XOBJ_TE_NPOBJ_ECODE;
857
+ throw err;
343
858
  };
344
- const key_names = readAsListS({
859
+ const len = args.length;
860
+ const hasOpt = len > 0 && isPlainObject(args[len - 1]);
861
+ const opt = hasOpt ? args.pop() : {};
862
+ const names = readAsListS({
345
863
  trim: true,
346
864
  keep_empty: false,
347
865
  }, ...args);
348
- for (let key_name of key_names) {
349
- if (insertXObjElement(obj, key_name, opt) !== null) count++;
866
+ let count = 0;
867
+ for (let key of names) {
868
+ if (insertXObjElement(obj, key, opt) !== null) count++;
350
869
  };
351
870
  return count;
352
871
  };
353
872
 
354
873
  function insertXObjEList(obj, name, opt){
355
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
356
- const key = typeof name === 'string' ? name.trim() : '';
357
- if (key === '') throw new TypeError(XOBJ_TE_KNES_EMSG);
358
- let force_act = false;
359
- let rip_oldies = false;
874
+ let err = null;
875
+ if (!isPlainObject(obj)) {
876
+ err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
877
+ err.code = XOBJ_TE_NPOBJ_ECODE;
878
+ throw err;
879
+ };
880
+ if (typeof name !== 'string') {
881
+ err = new TypeError(XOBJ_TE_NSTR_EMSG);
882
+ err.code = XOBJ_TE_NSTR_ECODE;
883
+ throw err;
884
+ };
885
+ const key = name.trim();
886
+ if (key === '') {
887
+ err = new TypeError(XOBJ_TE_KNES_EMSG);
888
+ err.code = XOBJ_TE_KNES_ECODE;
889
+ throw err;
890
+ };
891
+ let _options = opt;
360
892
  if (typeof opt === 'boolean') {
361
- force_act = opt;
362
- } else if (isPlainObject(opt)) {
363
- force_act = readAsBool(opt.force, false);
364
- if (force_act) rip_oldies = readAsBool(opt.rip_oldies, false);
365
- };
366
- let isACCEPTED = false;
367
- if (isNullOrUndef(obj[key])) {
368
- obj[key] = [];
369
- isACCEPTED = true;
370
- } else if (force_act) {
371
- if (rip_oldies || !isArray(obj[key])) obj[key] = [];
372
- isACCEPTED = true;
893
+ _options = { force: _options };
894
+ } else if (!isPlainObject(_options)) {
895
+ _options = {};
896
+ };
897
+ let { force, rip_oldies, ripOldies } = _options;
898
+ if (typeof force !== 'boolean') force = false;
899
+ if (ripOldies === undefined) ripOldies = rip_oldies;
900
+ if (typeof ripOldies !== 'boolean') ripOldies = false;
901
+ let item = obj[key];
902
+ let isACCEPTED = (
903
+ isNullOrUndef(item)
904
+ || (force && (ripOldies || !isArray(item)))
905
+ );
906
+ if (isACCEPTED) {
907
+ obj[key] = item = [];
373
908
  } else {
374
- isACCEPTED = isArray(obj[key]);
375
- if (!isACCEPTED && isPlainObject(obj[key])) {
376
- obj[key] = [ obj[key] ];
909
+ isACCEPTED = isArray(item);
910
+ if (!isACCEPTED && isPlainObject(item)) {
911
+ obj[key] = item = [ item ];
377
912
  isACCEPTED = true;
378
913
  };
379
914
  };
380
- return isACCEPTED ? obj[key] : null;
915
+ return isACCEPTED ? item : null;
381
916
  };
382
917
 
383
918
  function insertXObjEChain(obj, ...args){
384
- if (!isPlainObject(obj)) throw new TypeError(XOBJ_TE_NPOBJ_EMSG);
385
- let opt = {};
386
- let args_len = args.length;
387
- if (args_len > 0) {
388
- let pos = args_len-1;
389
- if (typeof args[pos] === 'boolean') {
390
- opt.force = args.pop();
391
- } else if (isPlainObject(args[pos])) {
392
- opt = args.pop();
393
- };
919
+ if (!isPlainObject(obj)) {
920
+ let err = new TypeError(XOBJ_TE_NPOBJ_EMSG);
921
+ err.code = XOBJ_TE_NPOBJ_ECODE;
922
+ throw err;
394
923
  };
395
- let key_names = readAsListS({
924
+ const len = args.length;
925
+ const hasOpt = len > 0 && isPlainObject(args[len - 1]);
926
+ const opt = hasOpt ? args.pop() : {};
927
+ const names = readAsListS({
396
928
  trim: true,
397
929
  keep_empty: false,
398
930
  }, ...args);
399
931
  let curObj = obj;
400
932
  let isSUCCEED = false;
401
- for (let key_name of key_names) {
402
- obj = insertXObjElement(obj, key_name, opt);
933
+ for (let key of names) {
934
+ obj = insertXObjElement(obj, key, opt);
403
935
  isSUCCEED = isPlainObject(obj);
404
936
  if (!isSUCCEED) break;
405
937
  curObj = obj;
@@ -508,6 +1040,8 @@ exports.DEF_XML_PARSE_OPTIONS = DEF_XML_PARSE_OPTIONS;
508
1040
 
509
1041
  exports.TXmlContentParseOptions = TXmlContentParseOptions;
510
1042
 
1043
+ exports.evalXObjEName = evalXObjEName;
1044
+
511
1045
  exports.readXObjParamRaw = readXObjParamRaw;
512
1046
  exports.readXObjParam = readXObjParam;
513
1047
  exports.readXObjParamAsBool = readXObjParamAsBool;
@@ -535,6 +1069,8 @@ exports.writeXObjAttrAsIndex = writeXObjAttrAsIndex;
535
1069
  exports.writeXObjAttrEx = writeXObjAttrEx;
536
1070
 
537
1071
  exports.getXObjAttributes = getXObjAttributes;
1072
+ exports.checkXObjAttribute = checkXObjAttribute;
1073
+ exports.deleteXObjAttribute = deleteXObjAttribute;
538
1074
 
539
1075
  exports.getXObjElement = getXObjElement;
540
1076
  exports.insertXObjElement = insertXObjElement;