@yuneta/gobj-js 7.25.0 → 7.25.2

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.
@@ -3218,8 +3218,8 @@
3218
3218
  }
3219
3219
  function trace_json(jn, msg) {
3220
3220
  if (console_wants("json", msg)) {
3221
- if (msg) window.console.warn("=====> " + msg);
3222
- window.console.dir(jn);
3221
+ if (msg) _console.warn("=====> " + msg);
3222
+ _console.dir(jn);
3223
3223
  }
3224
3224
  emit_log_callback("json", jn, current_timestamp());
3225
3225
  }
@@ -3607,7 +3607,11 @@
3607
3607
  return 0;
3608
3608
  }
3609
3609
  /************************************************************
3610
- *
3610
+ * As the C kw_get_bool(): a boolean found is the answer, and
3611
+ * anything else gives the default back -- unless KW_WILD_NUMBER
3612
+ * asks to read a number (0 is false), a string ("true"/"false"
3613
+ * in any case, else its integer) or null (false). Before gobj-js
3614
+ * 7.25.2 the value went through Boolean(), so "false" was TRUE.
3611
3615
  ************************************************************/
3612
3616
  function kw_get_bool(gobj, kw, path, default_value, flag) {
3613
3617
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3615,6 +3619,7 @@
3615
3619
  const required = flag && flag & kw_flag_t.KW_REQUIRED;
3616
3620
  const create = flag && flag & kw_flag_t.KW_CREATE;
3617
3621
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3622
+ const wild = flag && flag & kw_flag_t.KW_WILD_NUMBER;
3618
3623
  if (b === void 0) {
3619
3624
  if (create) {
3620
3625
  let v = Boolean(default_value);
@@ -3626,8 +3631,23 @@
3626
3631
  }
3627
3632
  return Boolean(default_value);
3628
3633
  }
3634
+ let value;
3635
+ if (is_boolean(b)) value = b;
3636
+ else if (wild && is_number(b)) value = b !== 0;
3637
+ else if (wild && is_string(b)) {
3638
+ if (b.toLowerCase() === "true") value = true;
3639
+ else if (b.toLowerCase() === "false") value = false;
3640
+ else value = (parseInt(b) || 0) !== 0;
3641
+ } else if (wild && b === null) value = false;
3642
+ else {
3643
+ if (required) {
3644
+ log_error(`${gobj_short_name(gobj)}: path value MUST BE a boolean: ${path}`);
3645
+ trace_msg(kw);
3646
+ }
3647
+ return Boolean(default_value);
3648
+ }
3629
3649
  if (extract) kw_delete(gobj, kw, path);
3630
- return Boolean(b);
3650
+ return value;
3631
3651
  }
3632
3652
  /************************************************************
3633
3653
  *
@@ -3690,7 +3710,12 @@
3690
3710
  return Number(v);
3691
3711
  }
3692
3712
  /************************************************************
3693
- *
3713
+ * The default comes back AS GIVEN, as in the C kw_get_str()
3714
+ * (`const char *default_value`, where 0 is NULL). Turned into
3715
+ * a string, a default of 0 or null was "0" or "null", which is
3716
+ * TRUE: an `if(value)` on the answer took an absent key for a
3717
+ * present one. KW_CREATE stores a string default, and null for
3718
+ * any other, as C stores json_null() for a NULL default.
3694
3719
  ************************************************************/
3695
3720
  function kw_get_str(gobj, kw, path, default_value, flag) {
3696
3721
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3700,14 +3725,13 @@
3700
3725
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3701
3726
  if (v === void 0) {
3702
3727
  if (create) {
3703
- let v = String(default_value);
3704
- kw_set_dict_value(gobj, kw, path, v);
3705
- return v;
3728
+ kw_set_dict_value(gobj, kw, path, is_string(default_value) ? default_value : null);
3729
+ return default_value;
3706
3730
  } else if (required) {
3707
3731
  log_error(`path not found: '${path}'`);
3708
3732
  trace_json(kw);
3709
3733
  }
3710
- return String(default_value);
3734
+ return default_value;
3711
3735
  }
3712
3736
  if (extract) kw_delete(gobj, kw, path);
3713
3737
  if (!is_string(v)) {
@@ -3715,9 +3739,9 @@
3715
3739
  log_error(`${gobj_short_name(gobj)}: path value MUST BE a string: ${path}`);
3716
3740
  trace_msg(kw);
3717
3741
  }
3718
- return String(default_value);
3742
+ return default_value;
3719
3743
  }
3720
- return String(v);
3744
+ return v;
3721
3745
  }
3722
3746
  /************************************************************
3723
3747
  *
@@ -3743,7 +3767,11 @@
3743
3767
  return v;
3744
3768
  }
3745
3769
  /************************************************************
3746
- *
3770
+ * As the C kw_get_dict(): a dict found is the answer, and
3771
+ * anything else gives the default back AS GIVEN (null stays
3772
+ * null). KW_CREATE stores a dict default, never a null one.
3773
+ * Before gobj-js 7.25.2 the answer went through Object(), so a
3774
+ * null default came back as {} and a 0 as a Number object.
3747
3775
  ************************************************************/
3748
3776
  function kw_get_dict(gobj, kw, path, default_value, flag) {
3749
3777
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3752,25 +3780,25 @@
3752
3780
  const create = flag && flag & kw_flag_t.KW_CREATE;
3753
3781
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3754
3782
  if (v === void 0) {
3755
- if (create) {
3756
- let v = Object(default_value);
3757
- kw_set_dict_value(gobj, kw, path, v);
3758
- return v;
3759
- } else if (required) {
3783
+ if (create && is_object(default_value) && kw) {
3784
+ kw_set_dict_value(gobj, kw, path, default_value);
3785
+ return default_value;
3786
+ }
3787
+ if (required) {
3760
3788
  log_error(`path not found: '${path}'`);
3761
3789
  trace_json(kw);
3762
3790
  }
3763
- return Object(default_value);
3791
+ return default_value;
3764
3792
  }
3765
- if (extract) kw_delete(gobj, kw, path);
3766
3793
  if (!is_object(v)) {
3767
3794
  if (required) {
3768
- log_error(`path value MUST BE a dict: ${path}`);
3795
+ log_error(`${gobj_short_name(gobj)}: path value MUST BE a dict: ${path}`);
3769
3796
  trace_msg(kw);
3770
3797
  }
3771
- return Object(default_value);
3798
+ return default_value;
3772
3799
  }
3773
- return Object(v);
3800
+ if (extract) kw_delete(gobj, kw, path);
3801
+ return v;
3774
3802
  }
3775
3803
  /************************************************************
3776
3804
  *
@@ -3796,7 +3824,12 @@
3796
3824
  return v;
3797
3825
  }
3798
3826
  /************************************************************
3799
- *
3827
+ * As the C kw_get_list(): a list found is the answer, and
3828
+ * anything else gives the default back AS GIVEN. KW_CREATE
3829
+ * stores a list default, never a null one. Before gobj-js
3830
+ * 7.25.2 the answer went through Array(), which WRAPS its
3831
+ * argument: a list found came back as [list], a default of []
3832
+ * as [[]] and a null one as [null].
3800
3833
  ************************************************************/
3801
3834
  function kw_get_list(gobj, kw, path, default_value, flag) {
3802
3835
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3805,25 +3838,25 @@
3805
3838
  const create = flag && flag & kw_flag_t.KW_CREATE;
3806
3839
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3807
3840
  if (v === void 0) {
3808
- if (create) {
3809
- let v = Array(default_value);
3810
- kw_set_dict_value(gobj, kw, path, v);
3811
- return v;
3812
- } else if (required) {
3841
+ if (create && is_array(default_value) && kw) {
3842
+ kw_set_dict_value(gobj, kw, path, default_value);
3843
+ return default_value;
3844
+ }
3845
+ if (required) {
3813
3846
  log_error(`path not found: '${path}'`);
3814
3847
  trace_json(kw);
3815
3848
  }
3816
- return Array(default_value);
3849
+ return default_value;
3817
3850
  }
3818
- if (extract) kw_delete(gobj, kw, path);
3819
3851
  if (!is_array(v)) {
3820
3852
  if (required) {
3821
- log_error(`path value MUST BE an array: ${path}`);
3853
+ log_error(`${gobj_short_name(gobj)}: path value MUST BE an array: ${path}`);
3822
3854
  trace_msg(kw);
3823
3855
  }
3824
- return Array(default_value);
3856
+ return default_value;
3825
3857
  }
3826
- return Array(v);
3858
+ if (extract) kw_delete(gobj, kw, path);
3859
+ return v;
3827
3860
  }
3828
3861
  /************************************************************
3829
3862
  *
@@ -3859,7 +3892,7 @@
3859
3892
  log_error("kw is not an object");
3860
3893
  return -1;
3861
3894
  }
3862
- let subdict = kw_get_dict(gobj, kw, path, {}, true, true);
3895
+ let subdict = kw_get_dict(gobj, kw, path, {}, kw_flag_t.KW_CREATE);
3863
3896
  if (!is_object(subdict)) {
3864
3897
  log_error("subdict is not an object");
3865
3898
  return -1;