|
|
|
|
@ -46,105 +46,120 @@ function containsNamespace (str, namespace) {
|
|
|
|
|
* Convert a data descriptor to accessor descriptor.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function convertDataDescriptorToAccessor (obj, prop, message) {
|
|
|
|
|
var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
|
|
|
|
|
var value = descriptor.value
|
|
|
|
|
function containsNamespace(str, namespace) {
|
|
|
|
|
// 使用正则表达式将字符串按空格或逗号分割成数组
|
|
|
|
|
var vals = str.split(/[ ,]+/);
|
|
|
|
|
// 将命名空间转换为小写以进行不区分大小写的比较
|
|
|
|
|
var ns = String(namespace).toLowerCase();
|
|
|
|
|
|
|
|
|
|
descriptor.get = function getter () { return value }
|
|
|
|
|
// 遍历分割后的数组
|
|
|
|
|
for (var i = 0; i < vals.length; i++) {
|
|
|
|
|
var val = vals[i];
|
|
|
|
|
|
|
|
|
|
if (descriptor.writable) {
|
|
|
|
|
descriptor.set = function setter (val) { return (value = val) }
|
|
|
|
|
// 如果 val 存在,并且等于 '*' 或者等于指定的命名空间,则返回 true
|
|
|
|
|
if (val && (val === '*' || val.toLowerCase() === ns)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete descriptor.value
|
|
|
|
|
delete descriptor.writable
|
|
|
|
|
|
|
|
|
|
Object.defineProperty(obj, prop, descriptor)
|
|
|
|
|
|
|
|
|
|
return descriptor
|
|
|
|
|
// 如果没有找到匹配的命名空间,则返回 false
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create arguments string to keep arity.
|
|
|
|
|
* 将数据描述符转换为访问器描述符。
|
|
|
|
|
* @param {Object} obj - 要修改的对象。
|
|
|
|
|
* @param {string} prop - 要转换的属性名。
|
|
|
|
|
* @param {string} message - 相关消息(未使用)。
|
|
|
|
|
* @returns {Object} - 返回转换后的描述符。
|
|
|
|
|
*/
|
|
|
|
|
function convertDataDescriptorToAccessor(obj, prop, message) {
|
|
|
|
|
// 获取对象的属性描述符
|
|
|
|
|
var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
|
|
|
// 获取属性的值
|
|
|
|
|
var value = descriptor.value;
|
|
|
|
|
|
|
|
|
|
function createArgumentsString (arity) {
|
|
|
|
|
var str = ''
|
|
|
|
|
// 定义 getter 方法,返回属性的值
|
|
|
|
|
descriptor.get = function getter() { return value; };
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < arity; i++) {
|
|
|
|
|
str += ', arg' + i
|
|
|
|
|
// 如果属性是可写的,则定义 setter 方法
|
|
|
|
|
if (descriptor.writable) {
|
|
|
|
|
descriptor.set = function setter(val) { return (value = val); };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return str.substr(2)
|
|
|
|
|
// 删除原有的值和可写性描述符
|
|
|
|
|
delete descriptor.value;
|
|
|
|
|
delete descriptor.writable;
|
|
|
|
|
|
|
|
|
|
// 使用新的描述符重新定义对象的属性
|
|
|
|
|
Object.defineProperty(obj, prop, descriptor);
|
|
|
|
|
|
|
|
|
|
// 返回转换后的描述符
|
|
|
|
|
return descriptor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create stack string from stack.
|
|
|
|
|
* Create arguments string to keep arity.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function createStackString (stack) {
|
|
|
|
|
var str = this.name + ': ' + this.namespace
|
|
|
|
|
/**
|
|
|
|
|
* 检查给定的字符串中是否包含指定的命名空间。
|
|
|
|
|
* @param {string} str - 要检查的字符串,可能包含多个命名空间。
|
|
|
|
|
* @param {string} namespace - 要查找的命名空间。
|
|
|
|
|
* @returns {boolean} - 如果字符串中包含命名空间,则返回 true;否则返回 false。
|
|
|
|
|
*/
|
|
|
|
|
function containsNamespace(str, namespace) {
|
|
|
|
|
// 使用正则表达式将字符串按空格或逗号分割成数组
|
|
|
|
|
var vals = str.split(/[ ,]+/);
|
|
|
|
|
// 将命名空间转换为小写以进行不区分大小写的比较
|
|
|
|
|
var ns = String(namespace).toLowerCase();
|
|
|
|
|
|
|
|
|
|
if (this.message) {
|
|
|
|
|
str += ' deprecated ' + this.message
|
|
|
|
|
}
|
|
|
|
|
// 遍历分割后的数组
|
|
|
|
|
for (var i = 0; i < vals.length; i++) {
|
|
|
|
|
var val = vals[i];
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < stack.length; i++) {
|
|
|
|
|
str += '\n at ' + stack[i].toString()
|
|
|
|
|
// 如果 val 存在,并且等于 '*' 或者等于指定的命名空间,则返回 true
|
|
|
|
|
if (val && (val === '*' || val.toLowerCase() === ns)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return str
|
|
|
|
|
// 如果没有找到匹配的命名空间,则返回 false
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create deprecate for namespace in caller.
|
|
|
|
|
* 将数据描述符转换为访问器描述符。
|
|
|
|
|
* @param {Object} obj - 要修改的对象。
|
|
|
|
|
* @param {string} prop - 要转换的属性名。
|
|
|
|
|
* @param {string} message - 相关消息(未使用)。
|
|
|
|
|
* @returns {Object} - 返回转换后的描述符。
|
|
|
|
|
*/
|
|
|
|
|
function convertDataDescriptorToAccessor(obj, prop, message) {
|
|
|
|
|
// 获取对象的属性描述符
|
|
|
|
|
var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
|
|
|
// 获取属性的值
|
|
|
|
|
var value = descriptor.value;
|
|
|
|
|
|
|
|
|
|
function depd (namespace) {
|
|
|
|
|
if (!namespace) {
|
|
|
|
|
throw new TypeError('argument namespace is required')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var stack = getStack()
|
|
|
|
|
var site = callSiteLocation(stack[1])
|
|
|
|
|
var file = site[0]
|
|
|
|
|
// 定义 getter 方法,返回属性的值
|
|
|
|
|
descriptor.get = function getter() { return value; };
|
|
|
|
|
|
|
|
|
|
function deprecate (message) {
|
|
|
|
|
// call to self as log
|
|
|
|
|
log.call(deprecate, message)
|
|
|
|
|
// 如果属性是可写的,则定义 setter 方法
|
|
|
|
|
if (descriptor.writable) {
|
|
|
|
|
descriptor.set = function setter(val) { return (value = val); };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deprecate._file = file
|
|
|
|
|
deprecate._ignored = isignored(namespace)
|
|
|
|
|
deprecate._namespace = namespace
|
|
|
|
|
deprecate._traced = istraced(namespace)
|
|
|
|
|
deprecate._warned = Object.create(null)
|
|
|
|
|
// 删除原有的值和可写性描述符
|
|
|
|
|
delete descriptor.value;
|
|
|
|
|
delete descriptor.writable;
|
|
|
|
|
|
|
|
|
|
deprecate.function = wrapfunction
|
|
|
|
|
deprecate.property = wrapproperty
|
|
|
|
|
// 使用新的描述符重新定义对象的属性
|
|
|
|
|
Object.defineProperty(obj, prop, descriptor);
|
|
|
|
|
|
|
|
|
|
return deprecate
|
|
|
|
|
// 返回转换后的描述符
|
|
|
|
|
return descriptor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Determine if event emitter has listeners of a given type.
|
|
|
|
|
*
|
|
|
|
|
* The way to do this check is done three different ways in Node.js >= 0.8
|
|
|
|
|
* so this consolidates them into a minimal set using instance methods.
|
|
|
|
|
*
|
|
|
|
|
* @param {EventEmitter} emitter
|
|
|
|
|
* @param {string} type
|
|
|
|
|
* @returns {boolean}
|
|
|
|
|
* @private
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function eehaslisteners (emitter, type) {
|
|
|
|
|
var count = typeof emitter.listenerCount !== 'function'
|
|
|
|
|
? emitter.listeners(type).length
|
|
|
|
|
: emitter.listenerCount(type)
|
|
|
|
|
|
|
|
|
|
return count > 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Determine if namespace is ignored.
|
|
|
|
|
|