From e78d3f7ff0dd1ac53a5c127a249ba1b47e745b18 Mon Sep 17 00:00:00 2001 From: Bradley Farias Date: Wed, 25 Aug 2021 12:25:12 -0500 Subject: [PATCH] handle prototype based accessors --- index.cjs | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/index.cjs b/index.cjs index 00df2a59e..0a45325f0 100644 --- a/index.cjs +++ b/index.cjs @@ -15,6 +15,26 @@ function Argv(processArgs, cwd) { return argv; } +function defineGetter(obj, key, getter) { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: true, + get: getter, + }); +} +function lookupGetter(obj, key) { + while (obj) { + const desc = Object.getOwnPropertyDescriptor(obj, key); + if (typeof desc !== 'undefined') { + if (desc.get) { + return desc.get; + } + return undefined; + } + obj = Object.getPrototypeOf(obj); + } +} + /* Hack an instance of Argv with process.argv into Argv so people can do require('yargs')(['--beeble=1','-z','zizzle']).argv @@ -28,24 +48,12 @@ function singletonify(inst) { ...Object.getOwnPropertyNames(inst.constructor.prototype), ].forEach(key => { if (key === 'argv') { - Object.defineProperty(Argv, key, Object.getOwnPropertyDescriptor(inst, key)); + defineGetter(Argv, key, lookupGetter(inst, key)); } else if (typeof inst[key] === 'function') { Argv[key] = inst[key].bind(inst); } else { - Object.defineProperty(Argv, '$0', { - configurable: true, - enumerable: true, - get() { - return inst.$0; - } - }); - Object.defineProperty(Argv, 'parsed', { - configurable: true, - enumerable: true, - get() { - return inst.parsed; - } - }); + defineGetter(Argv, '$0', () => inst.$0); + defineGetter(Argv, 'parsed', () => inst.parsed); } }); }