diff --git a/src/packager/lib/deep-clone.js b/src/packager/lib/deep-clone.js new file mode 100644 index 0000000..b40b88f --- /dev/null +++ b/src/packager/lib/deep-clone.js @@ -0,0 +1,24 @@ +const deepClone = (obj) => { + if (obj instanceof Blob) { + return obj; + } + if (Array.isArray(obj)) { + const result = []; + for (const value of obj) { + result.push(deepClone(value)); + } + return result; + } + if (obj && typeof obj === 'object') { + // TODO: there's probably some prototype pollution in here + const result = {}; + for (const key of Object.keys(obj)) { + result[key] = deepClone(obj[key]); + } + return result; + } + // Primitive type + return obj; +}; + +export default deepClone; diff --git a/src/packager/packager.js b/src/packager/packager.js index 8add022..d409019 100644 --- a/src/packager/packager.js +++ b/src/packager/packager.js @@ -5,6 +5,7 @@ import {readAsArrayBuffer, readAsURL} from './lib/readers'; import largeAssets from './large-assets'; import xhr from './lib/xhr'; import pngToAppleICNS from './lib/icns'; +import deepClone from './lib/deep-clone'; const escapeXML = (v) => v.replace(/["'<>&]/g, (i) => { switch (i) { @@ -54,7 +55,7 @@ class Packager extends EventTarget { child () { const packager = new Packager(); - packager.options = JSON.parse(JSON.stringify(this.options)); + packager.options = deepClone(this.options); packager.vm = this.vm; packager.serialized = this.serialized; return packager;