Skip to content

Commit a26cfe5

Browse files
committed
refactor: extract deepObjectClone into libs/utils.js
Move the deep clone logic (JSON.parse/JSON.stringify) out of index.js and into a reusable deepObjectClone utility in libs/utils.js alongside forEachObject.
1 parent 72012da commit a26cfe5

2 files changed

Lines changed: 14 additions & 1 deletion

File tree

index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
const requestRouter = require('./libs/request-router')
1010
const applySecurityHeaders = require('./libs/security-headers')
11+
const { deepObjectClone } = require('./libs/utils')
1112
const exts = {
1213
request: {},
1314
response: require('./libs/response-extensions')
@@ -82,7 +83,7 @@ module.exports = (options = {}) => {
8283
const val = copy[key]
8384
if (val && typeof val === 'object' && !Array.isArray(val) &&
8485
key !== 'server' && val.constructor === Object) {
85-
copy[key] = deepFreezePlain(JSON.parse(JSON.stringify(val)))
86+
copy[key] = deepFreezePlain(deepObjectClone(val))
8687
}
8788
}
8889
return Object.freeze(copy)

libs/utils.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,15 @@ module.exports.forEachObject = (obj, cb) => {
66
cb(obj[keys[i]], keys[i])
77
}
88
}
9+
10+
/**
11+
* Creates a deep clone of a serializable plain object.
12+
* Uses JSON.parse/stringify for a clean, immutable copy.
13+
* Skips non-serializable values (functions, symbols, undefined).
14+
*
15+
* @param {Object} obj
16+
* @returns {Object}
17+
*/
18+
module.exports.deepObjectClone = (obj) => {
19+
return JSON.parse(JSON.stringify(obj))
20+
}

0 commit comments

Comments
 (0)