From c27d8c488d75045c4bb58c47b7a12e8bba435342 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 14:45:43 +0300 Subject: [PATCH 01/14] chore(runtime): add full traverse raw library --- .../runtime/src/local-helpers/traverse-raw.js | 396 ++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 packages/runtime/src/local-helpers/traverse-raw.js diff --git a/packages/runtime/src/local-helpers/traverse-raw.js b/packages/runtime/src/local-helpers/traverse-raw.js new file mode 100644 index 000000000..52561f398 --- /dev/null +++ b/packages/runtime/src/local-helpers/traverse-raw.js @@ -0,0 +1,396 @@ +/* eslint-disable */ +'use strict'; + +var whichTypedArray = require('which-typed-array'); +var taSlice = require('typedarray.prototype.slice'); +var gopd = require('gopd'); + +// TODO: use call-bind, is-date, is-regex, is-string, is-boolean-object, is-number-object +function toS(obj) { return Object.prototype.toString.call(obj); } +function isDate(obj) { return toS(obj) === '[object Date]'; } +function isRegExp(obj) { return toS(obj) === '[object RegExp]'; } +function isError(obj) { return toS(obj) === '[object Error]'; } +function isBoolean(obj) { return toS(obj) === '[object Boolean]'; } +function isNumber(obj) { return toS(obj) === '[object Number]'; } +function isString(obj) { return toS(obj) === '[object String]'; } + +// TODO: use isarray +var isArray = Array.isArray || function isArray(xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +// TODO: use for-each? +function forEach(xs, fn) { + if (xs.forEach) { return xs.forEach(fn); } + for (var i = 0; i < xs.length; i++) { + fn(xs[i], i, xs); + } + return void undefined; +} + +// TODO: use object-keys +var objectKeys = Object.keys || function keys(obj) { + var res = []; + for (var key in obj) { res[res.length] = key; } // eslint-disable-line no-restricted-syntax + return res; +}; + +var propertyIsEnumerable = Object.prototype.propertyIsEnumerable; +var getOwnPropertySymbols = Object.getOwnPropertySymbols; // eslint-disable-line id-length + +// TODO: use reflect.ownkeys and filter out non-enumerables +function ownEnumerableKeys(obj) { + var res = objectKeys(obj); + + // Include enumerable symbol properties. + if (getOwnPropertySymbols) { + var symbols = getOwnPropertySymbols(obj); + for (var i = 0; i < symbols.length; i++) { + if (propertyIsEnumerable.call(obj, symbols[i])) { + res[res.length] = symbols[i]; + } + } + } + return res; +} + +// TODO: use object.hasown +var hasOwnProperty = Object.prototype.hasOwnProperty || function (obj, key) { + return key in obj; +}; + +function isWritable(object, key) { + if (typeof gopd !== 'function') { + return true; + } + + var desc = gopd(object, key); + return !desc || !desc.writable; +} + +function copy(src, options) { + if (typeof src === 'object' && src !== null) { + var dst; + + if (isArray(src)) { + dst = []; + } else if (isDate(src)) { + dst = new Date(src.getTime ? src.getTime() : src); + } else if (isRegExp(src)) { + dst = new RegExp(src); + } else if (isError(src)) { + dst = { message: src.message }; + } else if (isBoolean(src) || isNumber(src) || isString(src)) { + dst = Object(src); + } else { + var ta = whichTypedArray(src); + if (ta) { + return taSlice(src); + } else if (Object.create && Object.getPrototypeOf) { + dst = Object.create(Object.getPrototypeOf(src)); + } else if (src.constructor === Object) { + dst = {}; + } else { + var proto = (src.constructor && src.constructor.prototype) + || src.__proto__ + || {}; + var T = function T() {}; // eslint-disable-line func-style, func-name-matching + T.prototype = proto; + dst = new T(); + } + } + + var iteratorFunction = options.includeSymbols ? ownEnumerableKeys : objectKeys; + forEach(iteratorFunction(src), function (key) { + dst[key] = src[key]; + }); + return dst; + } + return src; +} + +/** @type {TraverseOptions} */ +var emptyNull = { __proto__: null }; + +function walk(root, cb) { + var path = []; + var parents = []; + var alive = true; + var options = arguments.length > 2 ? arguments[2] : emptyNull; + var iteratorFunction = options.includeSymbols ? ownEnumerableKeys : objectKeys; + var immutable = !!options.immutable; + + return (function walker(node_) { + var node = immutable ? copy(node_, options) : node_; + var modifiers = { __proto__: null }; + + var keepGoing = true; + + var state = { + node: node, + node_: node_, + path: [].concat(path), + parent: parents[parents.length - 1], + parents: parents, + key: path[path.length - 1], + removedKeys: { __proto__: null }, + isRoot: path.length === 0, + level: path.length, + circular: null, + update: function (x, stopHere) { + if (!state.isRoot) { + state.parent.node[state.key] = x; + } + state.node = x; + if (stopHere) { keepGoing = false; } + }, + delete: function (stopHere) { + delete state.parent.node[state.key]; + state.parent.removedKeys[state.key] = true; + if (stopHere) { keepGoing = false; } + }, + remove: function (stopHere) { + if (isArray(state.parent.node)) { + state.parent.node.splice(state.key, 1); + state.parent.removedKeys[state.key] = true; + if (stopHere) { keepGoing = false; } + } else { + state.delete(stopHere); + } + }, + keys: null, + before: function (f) { modifiers.before = f; }, + after: function (f) { modifiers.after = f; }, + pre: function (f) { modifiers.pre = f; }, + post: function (f) { modifiers.post = f; }, + stop: function () { alive = false; }, + block: function () { keepGoing = false; }, + }; + + if (!alive) { return state; } + + function updateState() { + if (typeof state.node === 'object' && state.node !== null) { + if (!state.keys || state.node_ !== state.node) { + state.keys = iteratorFunction(state.node); + } + + state.isLeaf = state.keys.length === 0; + + for (var i = 0; i < parents.length; i++) { + if (parents[i].node_ === node_) { + state.circular = parents[i]; + break; // eslint-disable-line no-restricted-syntax + } + } + } else { + state.isLeaf = true; + state.keys = null; + } + + state.notLeaf = !state.isLeaf; + state.notRoot = !state.isRoot; + } + + updateState(); + + // use return values to update if defined + var ret = cb.call(state, state.node); + if (ret !== undefined && state.update) { state.update(ret); } + + if (modifiers.before) { modifiers.before.call(state, state.node); } + + if (!keepGoing) { return state; } + + if ( + typeof state.node === 'object' + && state.node !== null + && !state.circular + ) { + parents[parents.length] = state; + + updateState(); + + forEach(state.keys, function (key, i) { + var prevIsRemoved = (i - 1) in state.removedKeys; + if (prevIsRemoved) { + key = state.keys[i - 1]; // eslint-disable-line no-param-reassign + } + + path[path.length] = (key); + + if (modifiers.pre) { modifiers.pre.call(state, state.node[key], key); } + + var child = walker(state.node[key]); + if ( + immutable + && hasOwnProperty.call(state.node, key) + && !isWritable(state.node, key) + && !prevIsRemoved + ) { + state.node[key] = child.node; + } + + child.isLast = i === state.keys.length - 1; + child.isFirst = i === 0; + + if (modifiers.post) { modifiers.post.call(state, child); } + + path.pop(); + }); + parents.pop(); + } + + if (modifiers.after) { modifiers.after.call(state, state.node); } + + return state; + }(root)).node; +} + +/** @typedef {{ immutable?: boolean, includeSymbols?: boolean }} TraverseOptions */ + +/** + * A traverse constructor + * @param {object} obj - the object to traverse + * @param {TraverseOptions | undefined} [options] - options for the traverse + * @constructor + */ +function Traverse(obj) { + /** @type {TraverseOptions} */ + this.options = arguments.length > 1 ? arguments[1] : emptyNull; + this.value = obj; +} + +/** @type {(ps: PropertyKey[]) => Traverse['value']} */ +Traverse.prototype.get = function (ps) { + var node = this.value; + for (var i = 0; node && i < ps.length; i++) { + var key = ps[i]; + if ( + !hasOwnProperty.call(node, key) + || (!this.options.includeSymbols && typeof key === 'symbol') + ) { + return void undefined; + } + node = node[key]; + } + return node; +}; + +/** @type {(ps: PropertyKey[]) => boolean} */ +Traverse.prototype.has = function (ps) { + var node = this.value; + // TODO: remove ps.length check + if (!node && ps.length > 0) { + return false; + } + for (var i = 0; node && i < ps.length; i++) { + var key = ps[i]; + if (!hasOwnProperty.call(node, key) || (!this.options.includeSymbols && typeof key === 'symbol')) { + return false; + } + node = node[key]; + } + return true; +}; + +Traverse.prototype.set = function (ps, value) { + var node = this.value; + for (var i = 0; i < ps.length - 1; i++) { + var key = ps[i]; + if (!hasOwnProperty.call(node, key)) { node[key] = {}; } + node = node[key]; + } + node[ps[i]] = value; + return value; +}; + +Traverse.prototype.map = function (cb) { + return walk(this.value, cb, { __proto__: null, immutable: true, includeSymbols: !!this.options.includeSymbols }); +}; + +Traverse.prototype.forEach = function (cb) { + this.value = walk(this.value, cb, this.options); + return this.value; +}; + +Traverse.prototype.reduce = function (cb, init) { + var skip = arguments.length === 1; + var acc = skip ? this.value : init; + this.forEach(function (x) { + if (!this.isRoot || !skip) { + acc = cb.call(this, acc, x); + } + }); + return acc; +}; + +Traverse.prototype.paths = function () { + var acc = []; + this.forEach(function () { + acc[acc.length] = this.path; + }); + return acc; +}; + +Traverse.prototype.nodes = function () { + var acc = []; + this.forEach(function () { + acc[acc.length] = this.node; + }); + return acc; +}; + +Traverse.prototype.clone = function () { + var parents = []; + var nodes = []; + var options = this.options; + + if (whichTypedArray(this.value)) { + return taSlice(this.value); + } + + return (function clone(src) { + for (var i = 0; i < parents.length; i++) { + if (parents[i] === src) { + return nodes[i]; + } + } + + if (typeof src === 'object' && src !== null) { + var dst = copy(src, options); + + parents[parents.length] = (src); + nodes[nodes.length] = (dst); + + var iteratorFunction = options.includeSymbols ? ownEnumerableKeys : objectKeys; + forEach(iteratorFunction(src), function (key) { + dst[key] = clone(src[key]); + }); + + parents.pop(); + nodes.pop(); + return dst; + } + + return src; + + }(this.value)); +}; + +/** @type {(obj: object, options?: TraverseOptions) => Traverse} */ +function traverse(obj) { + var options = arguments.length > 1 ? arguments[1] : emptyNull; + return new Traverse(obj, options); +} + +// TODO: replace with object.assign? +forEach(ownEnumerableKeys(Traverse.prototype), function (key) { + traverse[key] = function (obj) { + var args = [].slice.call(arguments, 1); + var t = new Traverse(obj); + return t[key].apply(t, args); + }; +}); + +module.exports = traverse; From bf9cf9d5beff983e6d0c0c274892d0500c8b825d Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 14:53:56 +0300 Subject: [PATCH 02/14] chore(runtime): remove unused traverse code --- .../runtime/src/local-helpers/traverse-raw.js | 310 +----------------- 1 file changed, 9 insertions(+), 301 deletions(-) diff --git a/packages/runtime/src/local-helpers/traverse-raw.js b/packages/runtime/src/local-helpers/traverse-raw.js index 52561f398..5c2bfe6a0 100644 --- a/packages/runtime/src/local-helpers/traverse-raw.js +++ b/packages/runtime/src/local-helpers/traverse-raw.js @@ -1,128 +1,12 @@ /* eslint-disable */ 'use strict'; -var whichTypedArray = require('which-typed-array'); -var taSlice = require('typedarray.prototype.slice'); -var gopd = require('gopd'); - -// TODO: use call-bind, is-date, is-regex, is-string, is-boolean-object, is-number-object -function toS(obj) { return Object.prototype.toString.call(obj); } -function isDate(obj) { return toS(obj) === '[object Date]'; } -function isRegExp(obj) { return toS(obj) === '[object RegExp]'; } -function isError(obj) { return toS(obj) === '[object Error]'; } -function isBoolean(obj) { return toS(obj) === '[object Boolean]'; } -function isNumber(obj) { return toS(obj) === '[object Number]'; } -function isString(obj) { return toS(obj) === '[object String]'; } - -// TODO: use isarray -var isArray = Array.isArray || function isArray(xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; - -// TODO: use for-each? -function forEach(xs, fn) { - if (xs.forEach) { return xs.forEach(fn); } - for (var i = 0; i < xs.length; i++) { - fn(xs[i], i, xs); - } - return void undefined; -} - -// TODO: use object-keys -var objectKeys = Object.keys || function keys(obj) { - var res = []; - for (var key in obj) { res[res.length] = key; } // eslint-disable-line no-restricted-syntax - return res; -}; - -var propertyIsEnumerable = Object.prototype.propertyIsEnumerable; -var getOwnPropertySymbols = Object.getOwnPropertySymbols; // eslint-disable-line id-length - -// TODO: use reflect.ownkeys and filter out non-enumerables -function ownEnumerableKeys(obj) { - var res = objectKeys(obj); - - // Include enumerable symbol properties. - if (getOwnPropertySymbols) { - var symbols = getOwnPropertySymbols(obj); - for (var i = 0; i < symbols.length; i++) { - if (propertyIsEnumerable.call(obj, symbols[i])) { - res[res.length] = symbols[i]; - } - } - } - return res; -} - -// TODO: use object.hasown -var hasOwnProperty = Object.prototype.hasOwnProperty || function (obj, key) { - return key in obj; -}; - -function isWritable(object, key) { - if (typeof gopd !== 'function') { - return true; - } - - var desc = gopd(object, key); - return !desc || !desc.writable; -} - -function copy(src, options) { - if (typeof src === 'object' && src !== null) { - var dst; - - if (isArray(src)) { - dst = []; - } else if (isDate(src)) { - dst = new Date(src.getTime ? src.getTime() : src); - } else if (isRegExp(src)) { - dst = new RegExp(src); - } else if (isError(src)) { - dst = { message: src.message }; - } else if (isBoolean(src) || isNumber(src) || isString(src)) { - dst = Object(src); - } else { - var ta = whichTypedArray(src); - if (ta) { - return taSlice(src); - } else if (Object.create && Object.getPrototypeOf) { - dst = Object.create(Object.getPrototypeOf(src)); - } else if (src.constructor === Object) { - dst = {}; - } else { - var proto = (src.constructor && src.constructor.prototype) - || src.__proto__ - || {}; - var T = function T() {}; // eslint-disable-line func-style, func-name-matching - T.prototype = proto; - dst = new T(); - } - } - - var iteratorFunction = options.includeSymbols ? ownEnumerableKeys : objectKeys; - forEach(iteratorFunction(src), function (key) { - dst[key] = src[key]; - }); - return dst; - } - return src; -} - -/** @type {TraverseOptions} */ -var emptyNull = { __proto__: null }; - function walk(root, cb) { var path = []; var parents = []; - var alive = true; - var options = arguments.length > 2 ? arguments[2] : emptyNull; - var iteratorFunction = options.includeSymbols ? ownEnumerableKeys : objectKeys; - var immutable = !!options.immutable; return (function walker(node_) { - var node = immutable ? copy(node_, options) : node_; - var modifiers = { __proto__: null }; + var node = node_; var keepGoing = true; @@ -133,46 +17,22 @@ function walk(root, cb) { parent: parents[parents.length - 1], parents: parents, key: path[path.length - 1], - removedKeys: { __proto__: null }, isRoot: path.length === 0, - level: path.length, circular: null, - update: function (x, stopHere) { + update: function (x) { if (!state.isRoot) { state.parent.node[state.key] = x; } state.node = x; - if (stopHere) { keepGoing = false; } - }, - delete: function (stopHere) { - delete state.parent.node[state.key]; - state.parent.removedKeys[state.key] = true; - if (stopHere) { keepGoing = false; } - }, - remove: function (stopHere) { - if (isArray(state.parent.node)) { - state.parent.node.splice(state.key, 1); - state.parent.removedKeys[state.key] = true; - if (stopHere) { keepGoing = false; } - } else { - state.delete(stopHere); - } + keepGoing = false; }, keys: null, - before: function (f) { modifiers.before = f; }, - after: function (f) { modifiers.after = f; }, - pre: function (f) { modifiers.pre = f; }, - post: function (f) { modifiers.post = f; }, - stop: function () { alive = false; }, - block: function () { keepGoing = false; }, }; - if (!alive) { return state; } - function updateState() { if (typeof state.node === 'object' && state.node !== null) { if (!state.keys || state.node_ !== state.node) { - state.keys = iteratorFunction(state.node); + state.keys = Object.keys(state.node); } state.isLeaf = state.keys.length === 0; @@ -194,11 +54,7 @@ function walk(root, cb) { updateState(); - // use return values to update if defined - var ret = cb.call(state, state.node); - if (ret !== undefined && state.update) { state.update(ret); } - - if (modifiers.before) { modifiers.before.call(state, state.node); } + cb.call(state, state.node); if (!keepGoing) { return state; } @@ -211,186 +67,38 @@ function walk(root, cb) { updateState(); - forEach(state.keys, function (key, i) { - var prevIsRemoved = (i - 1) in state.removedKeys; - if (prevIsRemoved) { - key = state.keys[i - 1]; // eslint-disable-line no-param-reassign - } - + state.keys.forEach(function (key, i) { path[path.length] = (key); - if (modifiers.pre) { modifiers.pre.call(state, state.node[key], key); } - var child = walker(state.node[key]); - if ( - immutable - && hasOwnProperty.call(state.node, key) - && !isWritable(state.node, key) - && !prevIsRemoved - ) { - state.node[key] = child.node; - } child.isLast = i === state.keys.length - 1; child.isFirst = i === 0; - if (modifiers.post) { modifiers.post.call(state, child); } - path.pop(); }); parents.pop(); } - if (modifiers.after) { modifiers.after.call(state, state.node); } - return state; }(root)).node; } -/** @typedef {{ immutable?: boolean, includeSymbols?: boolean }} TraverseOptions */ - -/** - * A traverse constructor - * @param {object} obj - the object to traverse - * @param {TraverseOptions | undefined} [options] - options for the traverse - * @constructor - */ function Traverse(obj) { - /** @type {TraverseOptions} */ - this.options = arguments.length > 1 ? arguments[1] : emptyNull; this.value = obj; } -/** @type {(ps: PropertyKey[]) => Traverse['value']} */ -Traverse.prototype.get = function (ps) { - var node = this.value; - for (var i = 0; node && i < ps.length; i++) { - var key = ps[i]; - if ( - !hasOwnProperty.call(node, key) - || (!this.options.includeSymbols && typeof key === 'symbol') - ) { - return void undefined; - } - node = node[key]; - } - return node; -}; - -/** @type {(ps: PropertyKey[]) => boolean} */ -Traverse.prototype.has = function (ps) { - var node = this.value; - // TODO: remove ps.length check - if (!node && ps.length > 0) { - return false; - } - for (var i = 0; node && i < ps.length; i++) { - var key = ps[i]; - if (!hasOwnProperty.call(node, key) || (!this.options.includeSymbols && typeof key === 'symbol')) { - return false; - } - node = node[key]; - } - return true; -}; - -Traverse.prototype.set = function (ps, value) { - var node = this.value; - for (var i = 0; i < ps.length - 1; i++) { - var key = ps[i]; - if (!hasOwnProperty.call(node, key)) { node[key] = {}; } - node = node[key]; - } - node[ps[i]] = value; - return value; -}; - Traverse.prototype.map = function (cb) { - return walk(this.value, cb, { __proto__: null, immutable: true, includeSymbols: !!this.options.includeSymbols }); + return walk(this.value, cb); }; Traverse.prototype.forEach = function (cb) { - this.value = walk(this.value, cb, this.options); + this.value = walk(this.value, cb); return this.value; }; -Traverse.prototype.reduce = function (cb, init) { - var skip = arguments.length === 1; - var acc = skip ? this.value : init; - this.forEach(function (x) { - if (!this.isRoot || !skip) { - acc = cb.call(this, acc, x); - } - }); - return acc; -}; - -Traverse.prototype.paths = function () { - var acc = []; - this.forEach(function () { - acc[acc.length] = this.path; - }); - return acc; -}; - -Traverse.prototype.nodes = function () { - var acc = []; - this.forEach(function () { - acc[acc.length] = this.node; - }); - return acc; -}; - -Traverse.prototype.clone = function () { - var parents = []; - var nodes = []; - var options = this.options; - - if (whichTypedArray(this.value)) { - return taSlice(this.value); - } - - return (function clone(src) { - for (var i = 0; i < parents.length; i++) { - if (parents[i] === src) { - return nodes[i]; - } - } - - if (typeof src === 'object' && src !== null) { - var dst = copy(src, options); - - parents[parents.length] = (src); - nodes[nodes.length] = (dst); - - var iteratorFunction = options.includeSymbols ? ownEnumerableKeys : objectKeys; - forEach(iteratorFunction(src), function (key) { - dst[key] = clone(src[key]); - }); - - parents.pop(); - nodes.pop(); - return dst; - } - - return src; - - }(this.value)); -}; - -/** @type {(obj: object, options?: TraverseOptions) => Traverse} */ function traverse(obj) { - var options = arguments.length > 1 ? arguments[1] : emptyNull; - return new Traverse(obj, options); + return new Traverse(obj); } -// TODO: replace with object.assign? -forEach(ownEnumerableKeys(Traverse.prototype), function (key) { - traverse[key] = function (obj) { - var args = [].slice.call(arguments, 1); - var t = new Traverse(obj); - return t[key].apply(t, args); - }; -}); - module.exports = traverse; From 1d956984aa0cc698d8a9d166590d09a974a6581e Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 14:54:17 +0300 Subject: [PATCH 03/14] chore(runtime): make traverse more readable --- .../runtime/src/local-helpers/traverse-raw.js | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/packages/runtime/src/local-helpers/traverse-raw.js b/packages/runtime/src/local-helpers/traverse-raw.js index 5c2bfe6a0..9376c287f 100644 --- a/packages/runtime/src/local-helpers/traverse-raw.js +++ b/packages/runtime/src/local-helpers/traverse-raw.js @@ -5,7 +5,7 @@ function walk(root, cb) { var path = []; var parents = []; - return (function walker(node_) { + function walker(node_) { var node = node_; var keepGoing = true; @@ -81,24 +81,13 @@ function walk(root, cb) { } return state; - }(root)).node; -} + } -function Traverse(obj) { - this.value = obj; + return walker(root).node; } -Traverse.prototype.map = function (cb) { - return walk(this.value, cb); -}; - -Traverse.prototype.forEach = function (cb) { - this.value = walk(this.value, cb); - return this.value; -}; - -function traverse(obj) { - return new Traverse(obj); +function traverse(obj, cb) { + return walk(obj, cb); } module.exports = traverse; From 7f38c08c2e11b94af63e36229754503e9cff1f89 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 14:58:02 +0300 Subject: [PATCH 04/14] chore(runtime): make minimal needed traverse version --- .../runtime/src/local-helpers/traverse-raw.js | 52 +++++-------------- 1 file changed, 14 insertions(+), 38 deletions(-) diff --git a/packages/runtime/src/local-helpers/traverse-raw.js b/packages/runtime/src/local-helpers/traverse-raw.js index 9376c287f..466aff076 100644 --- a/packages/runtime/src/local-helpers/traverse-raw.js +++ b/packages/runtime/src/local-helpers/traverse-raw.js @@ -2,17 +2,14 @@ 'use strict'; function walk(root, cb) { - var path = []; - var parents = []; + const path = []; + const parents = []; - function walker(node_) { - var node = node_; + function walker(node) { + let keepGoing = true; - var keepGoing = true; - - var state = { + const state = { node: node, - node_: node_, path: [].concat(path), parent: parents[parents.length - 1], parents: parents, @@ -26,34 +23,17 @@ function walk(root, cb) { state.node = x; keepGoing = false; }, - keys: null, }; - function updateState() { - if (typeof state.node === 'object' && state.node !== null) { - if (!state.keys || state.node_ !== state.node) { - state.keys = Object.keys(state.node); + if (typeof state.node === 'object' && state.node !== null) { + for (let i = 0; i < parents.length; i++) { + if (parents[i].node === state.node) { + state.circular = parents[i]; + break; } - - state.isLeaf = state.keys.length === 0; - - for (var i = 0; i < parents.length; i++) { - if (parents[i].node_ === node_) { - state.circular = parents[i]; - break; // eslint-disable-line no-restricted-syntax - } - } - } else { - state.isLeaf = true; - state.keys = null; } - - state.notLeaf = !state.isLeaf; - state.notRoot = !state.isRoot; } - updateState(); - cb.call(state, state.node); if (!keepGoing) { return state; } @@ -65,18 +45,14 @@ function walk(root, cb) { ) { parents[parents.length] = state; - updateState(); - - state.keys.forEach(function (key, i) { - path[path.length] = (key); + Object.keys(state.node).forEach((key) => { + path[path.length] = key; - var child = walker(state.node[key]); - - child.isLast = i === state.keys.length - 1; - child.isFirst = i === 0; + walker(state.node[key]); path.pop(); }); + parents.pop(); } From e36f0d6f0ef2a4ffd11e8dc82053780bce0a1c46 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 14:58:18 +0300 Subject: [PATCH 05/14] chore(runtime): move traverse to raw ts --- .../src/local-helpers/{traverse-raw.js => traverse-raw.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/runtime/src/local-helpers/{traverse-raw.js => traverse-raw.ts} (100%) diff --git a/packages/runtime/src/local-helpers/traverse-raw.js b/packages/runtime/src/local-helpers/traverse-raw.ts similarity index 100% rename from packages/runtime/src/local-helpers/traverse-raw.js rename to packages/runtime/src/local-helpers/traverse-raw.ts From 278c3ecae3b485ad2005532c2a9cbba47c6c2bd2 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 15:00:13 +0300 Subject: [PATCH 06/14] chore(runtime): add traverse some types --- .../runtime/src/local-helpers/traverse-raw.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/runtime/src/local-helpers/traverse-raw.ts b/packages/runtime/src/local-helpers/traverse-raw.ts index 466aff076..2cccb31be 100644 --- a/packages/runtime/src/local-helpers/traverse-raw.ts +++ b/packages/runtime/src/local-helpers/traverse-raw.ts @@ -1,22 +1,23 @@ /* eslint-disable */ -'use strict'; -function walk(root, cb) { - const path = []; - const parents = []; +type Cb = Function; - function walker(node) { +function walk(root: T, cb: Cb) { + const path: string[] = []; + const parents: any[] = []; + + function walker(node: any) { let keepGoing = true; const state = { node: node, - path: [].concat(path), + path: [...path], parent: parents[parents.length - 1], parents: parents, key: path[path.length - 1], isRoot: path.length === 0, circular: null, - update: function (x) { + update: function (x: any) { if (!state.isRoot) { state.parent.node[state.key] = x; } @@ -62,7 +63,7 @@ function walk(root, cb) { return walker(root).node; } -function traverse(obj, cb) { +function traverse(obj: T, cb: Cb) { return walk(obj, cb); } From cc411359e0b3299b9c5ef9d5efa06eb0fe9e703a Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 15:05:07 +0300 Subject: [PATCH 07/14] chore(runtime): remove traverse state, make clean function callback --- .../runtime/src/local-helpers/traverse-raw.ts | 74 +++++++++---------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/packages/runtime/src/local-helpers/traverse-raw.ts b/packages/runtime/src/local-helpers/traverse-raw.ts index 2cccb31be..15f62f97b 100644 --- a/packages/runtime/src/local-helpers/traverse-raw.ts +++ b/packages/runtime/src/local-helpers/traverse-raw.ts @@ -1,55 +1,51 @@ -/* eslint-disable */ - -type Cb = Function; +/* eslint-disable @typescript-eslint/no-explicit-any */ + +type Cb = ( + data: { + path: readonly string[]; + key: string; + value: any; + update: (nextValue: any) => void; + } +) => void; function walk(root: T, cb: Cb) { const path: string[] = []; const parents: any[] = []; function walker(node: any) { + const isObject = typeof node === 'object' && node !== null; + const isCircular = isObject && parents.some((p) => p === node); + const key = path[path.length - 1]; + let keepGoing = true; - const state = { - node: node, - path: [...path], - parent: parents[parents.length - 1], - parents: parents, - key: path[path.length - 1], - isRoot: path.length === 0, - circular: null, - update: function (x: any) { - if (!state.isRoot) { - state.parent.node[state.key] = x; - } - state.node = x; - keepGoing = false; - }, - }; - - if (typeof state.node === 'object' && state.node !== null) { - for (let i = 0; i < parents.length; i++) { - if (parents[i].node === state.node) { - state.circular = parents[i]; - break; - } + function update(nextValue: any) { + if (path.length) { + const parent = parents[parents.length - 1]; + parent[key] = nextValue; + node = nextValue; } + + keepGoing = false; } - cb.call(state, state.node); + cb({ + path: [...path], + key, + value: node, + update, + }); - if (!keepGoing) { return state; } + if (!keepGoing) return node; - if ( - typeof state.node === 'object' - && state.node !== null - && !state.circular - ) { - parents[parents.length] = state; + if (isObject && !isCircular) { + parents.push(node); - Object.keys(state.node).forEach((key) => { - path[path.length] = key; + Object.keys(node).forEach((key) => { + path.push(key); - walker(state.node[key]); + walker(node[key]); path.pop(); }); @@ -57,10 +53,10 @@ function walk(root: T, cb: Cb) { parents.pop(); } - return state; + return node; } - return walker(root).node; + return walker(root); } function traverse(obj: T, cb: Cb) { From 68e5a627e77d86db9a10a54cb2ea14aca563761e Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 15:05:34 +0300 Subject: [PATCH 08/14] chore(runtime): reindent traverse file tabs to spaces --- .../runtime/src/local-helpers/traverse-raw.ts | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/packages/runtime/src/local-helpers/traverse-raw.ts b/packages/runtime/src/local-helpers/traverse-raw.ts index 15f62f97b..9a123300a 100644 --- a/packages/runtime/src/local-helpers/traverse-raw.ts +++ b/packages/runtime/src/local-helpers/traverse-raw.ts @@ -1,66 +1,66 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ type Cb = ( - data: { - path: readonly string[]; - key: string; - value: any; - update: (nextValue: any) => void; - } + data: { + path: readonly string[]; + key: string; + value: any; + update: (nextValue: any) => void; + } ) => void; function walk(root: T, cb: Cb) { - const path: string[] = []; - const parents: any[] = []; + const path: string[] = []; + const parents: any[] = []; - function walker(node: any) { - const isObject = typeof node === 'object' && node !== null; - const isCircular = isObject && parents.some((p) => p === node); - const key = path[path.length - 1]; + function walker(node: any) { + const isObject = typeof node === 'object' && node !== null; + const isCircular = isObject && parents.some((p) => p === node); + const key = path[path.length - 1]; - let keepGoing = true; + let keepGoing = true; - function update(nextValue: any) { - if (path.length) { - const parent = parents[parents.length - 1]; - parent[key] = nextValue; - node = nextValue; - } + function update(nextValue: any) { + if (path.length) { + const parent = parents[parents.length - 1]; + parent[key] = nextValue; + node = nextValue; + } - keepGoing = false; - } + keepGoing = false; + } - cb({ - path: [...path], - key, - value: node, - update, - }); + cb({ + path: [...path], + key, + value: node, + update, + }); - if (!keepGoing) return node; + if (!keepGoing) return node; - if (isObject && !isCircular) { - parents.push(node); + if (isObject && !isCircular) { + parents.push(node); - Object.keys(node).forEach((key) => { - path.push(key); + Object.keys(node).forEach((key) => { + path.push(key); - walker(node[key]); + walker(node[key]); - path.pop(); - }); + path.pop(); + }); - parents.pop(); - } + parents.pop(); + } - return node; - } + return node; + } - return walker(root); + return walker(root); } function traverse(obj: T, cb: Cb) { - return walk(obj, cb); + return walk(obj, cb); } module.exports = traverse; From c5dca8aa5ab1e3a0e7e9dc48bd8b26fbadfb7bf4 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 15:06:19 +0300 Subject: [PATCH 09/14] chore(runtime): traverse naming and exports --- packages/runtime/src/local-helpers/traverse-raw.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/runtime/src/local-helpers/traverse-raw.ts b/packages/runtime/src/local-helpers/traverse-raw.ts index 9a123300a..584d485c7 100644 --- a/packages/runtime/src/local-helpers/traverse-raw.ts +++ b/packages/runtime/src/local-helpers/traverse-raw.ts @@ -9,7 +9,7 @@ type Cb = ( } ) => void; -function walk(root: T, cb: Cb) { +export function simpleTraverse(root: T, cb: Cb) { const path: string[] = []; const parents: any[] = []; @@ -58,9 +58,3 @@ function walk(root: T, cb: Cb) { return walker(root); } - -function traverse(obj: T, cb: Cb) { - return walk(obj, cb); -} - -module.exports = traverse; From e9c546d0a3d94eb15565cc1f328501e5b03da9c7 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 15:06:33 +0300 Subject: [PATCH 10/14] chore(runtime): renaming traverse file --- .../src/local-helpers/{traverse-raw.ts => simple-traverse.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/runtime/src/local-helpers/{traverse-raw.ts => simple-traverse.ts} (100%) diff --git a/packages/runtime/src/local-helpers/traverse-raw.ts b/packages/runtime/src/local-helpers/simple-traverse.ts similarity index 100% rename from packages/runtime/src/local-helpers/traverse-raw.ts rename to packages/runtime/src/local-helpers/simple-traverse.ts From 5a973a4bbb071b9141f3f79933551ef0cf5e34d9 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 15:08:11 +0300 Subject: [PATCH 11/14] chore(runtime): add export, remove traverse dependency --- packages/runtime/package.json | 2 - packages/runtime/src/local-helpers/index.ts | 1 + pnpm-lock.yaml | 329 +------------------- 3 files changed, 2 insertions(+), 330 deletions(-) diff --git a/packages/runtime/package.json b/packages/runtime/package.json index c0453d148..188aefa6b 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -107,7 +107,6 @@ "safe-json-stringify": "^1.2.0", "semver": "^7.5.2", "superjson": "^1.13.0", - "traverse": "^0.6.10", "ts-pattern": "^4.3.0", "tslib": "^2.4.1", "uuid": "^9.0.0", @@ -127,7 +126,6 @@ "@types/pluralize": "^0.0.29", "@types/safe-json-stringify": "^1.1.5", "@types/semver": "^7.3.13", - "@types/traverse": "^0.6.37", "@types/uuid": "^8.3.4", "decimal.js-light": "^2.5.1", "superjson": "^1.13.0", diff --git a/packages/runtime/src/local-helpers/index.ts b/packages/runtime/src/local-helpers/index.ts index ace4550d2..f9bb01009 100644 --- a/packages/runtime/src/local-helpers/index.ts +++ b/packages/runtime/src/local-helpers/index.ts @@ -1,3 +1,4 @@ +export * from './simple-traverse'; export * from './sleep'; export * from './is-plain-object'; export * from './lower-case-first'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 061615d6d..10e45f37b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -379,9 +379,6 @@ importers: superjson: specifier: ^1.13.0 version: 1.13.3 - traverse: - specifier: ^0.6.10 - version: 0.6.10 ts-pattern: specifier: ^4.3.0 version: 4.3.0 @@ -410,9 +407,6 @@ importers: '@types/semver': specifier: ^7.3.13 version: 7.5.8 - '@types/traverse': - specifier: ^0.6.37 - version: 0.6.37 '@types/uuid': specifier: ^8.3.4 version: 8.3.4 @@ -3156,9 +3150,6 @@ packages: '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/traverse@0.6.37': - resolution: {integrity: sha512-c90MVeDiUI1FhOZ6rLQ3kDWr50YE8+paDpM+5zbHjbmsqEp2DlMYkqnZnwbK9oI+NvDe8yRajup4jFwnVX6xsA==} - '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -3604,10 +3595,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} @@ -4240,18 +4227,6 @@ packages: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -4553,10 +4528,6 @@ packages: error-stack-parser-es@0.1.4: resolution: {integrity: sha512-l0uy0kAoo6toCgVOYaAayqtPa2a1L15efxUMEnQebKwLQX2X0OpS6wMMQdc4juJXmxd9i40DuaUHq+mjIya9TQ==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -4568,18 +4539,6 @@ packages: es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -4937,10 +4896,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -4979,10 +4934,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - get-tsconfig@4.7.5: resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} @@ -5041,10 +4992,6 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -5340,10 +5287,6 @@ packages: resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -5401,10 +5344,6 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -5468,10 +5407,6 @@ packages: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -5480,9 +5415,6 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} @@ -6223,6 +6155,7 @@ packages: multer@1.4.4-lts.1: resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} engines: {node: '>= 6.0.0'} + deprecated: Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version. mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -7263,10 +7196,6 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -7276,10 +7205,6 @@ packages: safe-json-stringify@1.2.0: resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safe-regex2@3.1.0: resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} @@ -7540,17 +7465,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} @@ -7834,10 +7748,6 @@ packages: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} - traverse@0.6.10: - resolution: {integrity: sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==} - engines: {node: '>= 0.4'} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -7974,29 +7884,9 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - typed-rest-client@1.8.11: resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} - typedarray.prototype.slice@1.0.3: - resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==} - engines: {node: '>= 0.4'} - typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -8034,9 +7924,6 @@ packages: ultrahtml@1.5.3: resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -11424,8 +11311,6 @@ snapshots: '@types/tough-cookie@4.0.5': {} - '@types/traverse@0.6.37': {} - '@types/uuid@8.3.4': {} '@types/vscode@1.90.0': {} @@ -11993,17 +11878,6 @@ snapshots: array-union@2.1.0: {} - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - arrify@1.0.1: {} asap@2.0.6: {} @@ -12726,24 +12600,6 @@ snapshots: whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - date-fns@2.30.0: dependencies: '@babel/runtime': 7.24.7 @@ -12992,55 +12848,6 @@ snapshots: error-stack-parser-es@0.1.4: {} - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 @@ -13059,22 +12866,6 @@ snapshots: isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -13633,13 +13424,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - functions-have-names@1.2.3: {} gauge@3.0.2: @@ -13676,12 +13460,6 @@ snapshots: get-stream@8.0.1: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 @@ -13759,11 +13537,6 @@ snapshots: dependencies: type-fest: 0.20.2 - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -14089,10 +13862,6 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 @@ -14130,8 +13899,6 @@ snapshots: is-module@1.0.0: {} - is-negative-zero@2.0.3: {} - is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -14185,18 +13952,10 @@ snapshots: dependencies: has-symbols: 1.0.3 - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-unicode-supported@0.1.0: {} is-weakmap@2.0.2: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-weakset@2.0.3: dependencies: call-bind: 1.0.7 @@ -16423,25 +16182,12 @@ snapshots: dependencies: mri: 1.2.0 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} safe-json-stringify@1.2.0: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safe-regex2@3.1.0: dependencies: ret: 0.4.3 @@ -16708,25 +16454,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - string_decoder@0.10.31: {} string_decoder@1.1.1: @@ -17034,12 +16761,6 @@ snapshots: dependencies: punycode: 2.3.1 - traverse@0.6.10: - dependencies: - gopd: 1.0.1 - typedarray.prototype.slice: 1.0.3 - which-typed-array: 1.1.15 - tree-kill@1.2.2: {} ts-api-utils@1.3.0(typescript@5.5.2): @@ -17171,53 +16892,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - typed-rest-client@1.8.11: dependencies: qs: 6.12.1 tunnel: 0.0.6 underscore: 1.13.6 - typedarray.prototype.slice@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - typed-array-buffer: 1.0.2 - typed-array-byte-offset: 1.0.2 - typedarray@0.0.6: {} typescript@5.5.2: {} @@ -17240,13 +16920,6 @@ snapshots: ultrahtml@1.5.3: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - uncrypto@0.1.3: {} unctx@2.3.1: From 184aa748c174a2aa3ea54a79bac3f47d5a7fda00 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 15:13:39 +0300 Subject: [PATCH 12/14] chore(runtime): use custom traverse --- .../runtime/src/enhancements/node/delegate.ts | 9 ++++----- .../enhancements/node/policy/policy-utils.ts | 18 +++++++----------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/packages/runtime/src/enhancements/node/delegate.ts b/packages/runtime/src/enhancements/node/delegate.ts index 06d6b2341..14d73033a 100644 --- a/packages/runtime/src/enhancements/node/delegate.ts +++ b/packages/runtime/src/enhancements/node/delegate.ts @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import deepmerge, { type ArrayMergeOptions } from 'deepmerge'; -import traverse from 'traverse'; import { DELEGATE_AUX_RELATION_PREFIX } from '../../constants'; import { FieldInfo, @@ -14,7 +13,7 @@ import { isDelegateModel, resolveField, } from '../../cross'; -import { isPlainObject, lowerCaseFirst } from '../../local-helpers'; +import { isPlainObject, simpleTraverse, lowerCaseFirst } from '../../local-helpers'; import type { CrudContract, DbClientContract, EnhancementContext } from '../../types'; import type { InternalEnhancementOptions } from './create-enhancement'; import { Logger } from './logger'; @@ -487,12 +486,12 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler { const prisma = this.prisma; const prismaModule = this.options.prismaModule; - traverse(data).forEach(function () { - if (this.key?.startsWith(DELEGATE_AUX_RELATION_PREFIX)) { + simpleTraverse(data, ({ key }) => { + if (key.startsWith(DELEGATE_AUX_RELATION_PREFIX)) { throw prismaClientValidationError( prisma, prismaModule, - `Auxiliary relation field "${this.key}" cannot be set directly` + `Auxiliary relation field "${key}" cannot be set directly` ); } }); diff --git a/packages/runtime/src/enhancements/node/policy/policy-utils.ts b/packages/runtime/src/enhancements/node/policy/policy-utils.ts index 36f4a3212..e388a21b2 100644 --- a/packages/runtime/src/enhancements/node/policy/policy-utils.ts +++ b/packages/runtime/src/enhancements/node/policy/policy-utils.ts @@ -1,7 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import deepmerge from 'deepmerge'; -import traverse from 'traverse'; import { z, type ZodError, type ZodObject, type ZodSchema } from 'zod'; import { fromZodError } from 'zod-validation-error'; import { CrudFailureReason, PrismaErrorCode } from '../../../constants'; @@ -15,7 +14,7 @@ import { type FieldInfo, type ModelMeta, } from '../../../cross'; -import { isPlainObject, lowerCaseFirst, upperCaseFirst } from '../../../local-helpers'; +import { isPlainObject, simpleTraverse, lowerCaseFirst, upperCaseFirst } from '../../../local-helpers'; import { AuthUser, CrudContract, @@ -691,27 +690,24 @@ export class PolicyUtil extends QueryUtils { // here we prefix the constraint variables coming from delegated checkers // with the relation field name to avoid conflicts const prefixConstraintVariables = (constraint: unknown, prefix: string) => { - return traverse(constraint).map(function (value) { + return simpleTraverse(constraint, ({ value, update }) => { if (isVariableConstraint(value)) { - this.update( + update( { ...value, name: `${prefix}${value.name}`, - }, - true + } ); } }); }; - // eslint-disable-next-line @typescript-eslint/no-this-alias - const that = this; - result = traverse(result).forEach(function (value) { + result = simpleTraverse(result, ({ value, update }) => { if (isDelegateConstraint(value)) { const { model: delegateModel, relation, operation: delegateOp } = value; - let newValue = that.getCheckerConstraint(delegateModel, delegateOp ?? operation); + let newValue = this.getCheckerConstraint(delegateModel, delegateOp ?? operation); newValue = prefixConstraintVariables(newValue, `${relation}.`); - this.update(newValue, true); + update(newValue); } }); From ce850db0ffc801c33a9f45388d241a54e1163d43 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 15:27:00 +0300 Subject: [PATCH 13/14] fix(runtime): key undefined --- packages/runtime/src/enhancements/node/delegate.ts | 2 +- packages/runtime/src/local-helpers/simple-traverse.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/runtime/src/enhancements/node/delegate.ts b/packages/runtime/src/enhancements/node/delegate.ts index 14d73033a..56f918f40 100644 --- a/packages/runtime/src/enhancements/node/delegate.ts +++ b/packages/runtime/src/enhancements/node/delegate.ts @@ -487,7 +487,7 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler { const prisma = this.prisma; const prismaModule = this.options.prismaModule; simpleTraverse(data, ({ key }) => { - if (key.startsWith(DELEGATE_AUX_RELATION_PREFIX)) { + if (key?.startsWith(DELEGATE_AUX_RELATION_PREFIX)) { throw prismaClientValidationError( prisma, prismaModule, diff --git a/packages/runtime/src/local-helpers/simple-traverse.ts b/packages/runtime/src/local-helpers/simple-traverse.ts index 584d485c7..009e04390 100644 --- a/packages/runtime/src/local-helpers/simple-traverse.ts +++ b/packages/runtime/src/local-helpers/simple-traverse.ts @@ -3,7 +3,7 @@ type Cb = ( data: { path: readonly string[]; - key: string; + key: string | undefined; value: any; update: (nextValue: any) => void; } @@ -16,13 +16,13 @@ export function simpleTraverse(root: T, cb: Cb) { function walker(node: any) { const isObject = typeof node === 'object' && node !== null; const isCircular = isObject && parents.some((p) => p === node); - const key = path[path.length - 1]; let keepGoing = true; function update(nextValue: any) { if (path.length) { const parent = parents[parents.length - 1]; + const key = path[path.length - 1]; parent[key] = nextValue; node = nextValue; } @@ -32,7 +32,7 @@ export function simpleTraverse(root: T, cb: Cb) { cb({ path: [...path], - key, + key: path[path.length - 1], value: node, update, }); From 41ca3cceb85bfe0a26f1077af8a48d75f5c21630 Mon Sep 17 00:00:00 2001 From: FTB_lag Date: Sat, 21 Jun 2025 17:23:25 +0300 Subject: [PATCH 14/14] fix(runtime): traverse node not updated --- packages/runtime/src/local-helpers/simple-traverse.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/runtime/src/local-helpers/simple-traverse.ts b/packages/runtime/src/local-helpers/simple-traverse.ts index 009e04390..40ec68853 100644 --- a/packages/runtime/src/local-helpers/simple-traverse.ts +++ b/packages/runtime/src/local-helpers/simple-traverse.ts @@ -24,9 +24,10 @@ export function simpleTraverse(root: T, cb: Cb) { const parent = parents[parents.length - 1]; const key = path[path.length - 1]; parent[key] = nextValue; - node = nextValue; } + node = nextValue; + keepGoing = false; }