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