| 'use strict'; |
| |
| var assign = require('es5-ext/object/assign') |
| , normalizeOpts = require('es5-ext/object/normalize-options') |
| , isCallable = require('es5-ext/object/is-callable') |
| , contains = require('es5-ext/string/#/contains') |
| |
| , d; |
| |
| d = module.exports = function (dscr, value/*, options*/) { |
| var c, e, w, options, desc; |
| if ((arguments.length < 2) || (typeof dscr !== 'string')) { |
| options = value; |
| value = dscr; |
| dscr = null; |
| } else { |
| options = arguments[2]; |
| } |
| if (dscr == null) { |
| c = w = true; |
| e = false; |
| } else { |
| c = contains.call(dscr, 'c'); |
| e = contains.call(dscr, 'e'); |
| w = contains.call(dscr, 'w'); |
| } |
| |
| desc = { value: value, configurable: c, enumerable: e, writable: w }; |
| return !options ? desc : assign(normalizeOpts(options), desc); |
| }; |
| |
| d.gs = function (dscr, get, set/*, options*/) { |
| var c, e, options, desc; |
| if (typeof dscr !== 'string') { |
| options = set; |
| set = get; |
| get = dscr; |
| dscr = null; |
| } else { |
| options = arguments[3]; |
| } |
| if (get == null) { |
| get = undefined; |
| } else if (!isCallable(get)) { |
| options = get; |
| get = set = undefined; |
| } else if (set == null) { |
| set = undefined; |
| } else if (!isCallable(set)) { |
| options = set; |
| set = undefined; |
| } |
| if (dscr == null) { |
| c = true; |
| e = false; |
| } else { |
| c = contains.call(dscr, 'c'); |
| e = contains.call(dscr, 'e'); |
| } |
| |
| desc = { get: get, set: set, configurable: c, enumerable: e }; |
| return !options ? desc : assign(normalizeOpts(options), desc); |
| }; |