@yuneta/gobj-js 7.26.8 → 7.26.9

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.
@@ -4464,6 +4464,26 @@ function kw_set_dict_value(gobj, kw, path, value) {
4464
4464
  return 0;
4465
4465
  }
4466
4466
  /************************************************************
4467
+ * Whether walking `path` meets a value that is neither a dict nor
4468
+ * a list BEFORE its last segment: kw_find_path() logs that one
4469
+ * even when it is not verbose, so a writer that goes on to
4470
+ * kw_set_dict_value() would log it a second time.
4471
+ ************************************************************/
4472
+ function path_crosses_a_scalar(kw, path) {
4473
+ let ss = path.split("`");
4474
+ let v = kw;
4475
+ for (let i = 0; i < ss.length - 1; i++) {
4476
+ if (is_array(v)) {
4477
+ const idx = list_segment_index(v, ss[i]);
4478
+ if (idx < 0) return false;
4479
+ v = v[idx];
4480
+ } else v = Object.prototype.hasOwnProperty.call(v, ss[i]) ? v[ss[i]] : void 0;
4481
+ if (v === void 0 || v === null) return false;
4482
+ if (!(is_object(v) || is_array(v))) return true;
4483
+ }
4484
+ return false;
4485
+ }
4486
+ /************************************************************
4467
4487
  *
4468
4488
  ************************************************************/
4469
4489
  function kw_set_subdict_value(gobj, kw, path, key, value) {
@@ -4474,7 +4494,7 @@ function kw_set_subdict_value(gobj, kw, path, key, value) {
4474
4494
  }
4475
4495
  let subdict = kw_find_path(gobj, kw, path, false);
4476
4496
  if (subdict === void 0) {
4477
- if (!is_string(path)) return -1;
4497
+ if (!is_string(path) || path_crosses_a_scalar(kw, path)) return -1;
4478
4498
  subdict = {};
4479
4499
  if (kw_set_dict_value(gobj, kw, path, subdict) < 0) return -1;
4480
4500
  }
@@ -5202,12 +5222,12 @@ jdb_init(jdb);
5202
5222
  ************************************************************/
5203
5223
  function jdb_init(jdb, prefix, duplicate) {
5204
5224
  if (duplicate) jdb = json_deep_copy(jdb);
5205
- let type = kw_get_dict_value(null, jdb, "type", [], 1);
5206
- kw_get_str(null, jdb, "hook", "data", 1);
5207
- let schema = kw_get_dict_value(null, jdb, "schema", {}, 1);
5208
- let topics = kw_get_dict_value(null, jdb, "topics", {}, 1);
5225
+ let type = kw_get_dict_value(null, jdb, "type", [], kw_flag_t.KW_CREATE);
5226
+ kw_get_str(null, jdb, "hook", "data", kw_flag_t.KW_CREATE);
5227
+ let schema = kw_get_dict_value(null, jdb, "schema", {}, kw_flag_t.KW_CREATE);
5228
+ let topics = kw_get_dict_value(null, jdb, "topics", {}, kw_flag_t.KW_CREATE);
5209
5229
  let walk = function(obj, key, value, full_path) {
5210
- if (key.substring(0, 2) !== "__") kw_get_dict_value(null, topics, full_path, json_deep_copy(type), 1);
5230
+ if (key.substring(0, 2) !== "__") kw_get_dict_value(null, topics, full_path, json_deep_copy(type), kw_flag_t.KW_CREATE);
5211
5231
  };
5212
5232
  _traverse_dict(schema, walk, prefix);
5213
5233
  return jdb;
@@ -5235,14 +5255,14 @@ function jdb_update(jdb, topic_name, path, kw) {
5235
5255
  let v = topic;
5236
5256
  while (id = ids.shift()) {
5237
5257
  if (empty_string(id) || !v) break;
5238
- if (is_object(v)) v = kw_get_dict_value(null, v, jdb.hook, [], 1);
5258
+ if (is_object(v)) v = kw_get_dict_value(null, v, jdb.hook, [], kw_flag_t.KW_CREATE);
5239
5259
  v = _jdb_get(v, null, id, false);
5240
5260
  }
5241
5261
  if (ids.length === 0 && v) {
5242
5262
  if (is_array(v)) v.push(kw);
5243
5263
  else if (v["id"] === kw["id"]) json_object_update(v, kw);
5244
5264
  else {
5245
- let v_ = kw_get_dict_value(null, v, jdb.hook, [], 1);
5265
+ let v_ = kw_get_dict_value(null, v, jdb.hook, [], kw_flag_t.KW_CREATE);
5246
5266
  let v__ = _jdb_get(v_, jdb.hook, kw["id"], false);
5247
5267
  if (v__) json_object_update(v__, kw);
5248
5268
  else v_.push(kw);