Совместное использование документации между внутренним «module-global» и экспортированной функцией с разными именами - PullRequest
0 голосов
/ 14 апреля 2020

Итак, одна из вещей, которые мне больше всего нравятся в Node, это то, как вы можете использовать if( require.main === module ), как объясняется в Документах Node , для записи файла, который можно использовать как в качестве автономного сценария, так и в качестве библиотека для других модулей, поэтому большинство моих файлов имеют следующую структуру c:

function InternalModule_FunctionName(){
// some function "global" to the module scope.
}

if( require.main === module ){
//"Executable" mode; calling InternalModule_FunctionName directly
InternalModule_FunctionName();
} else{
//Library mode; export InternalModule_FunctionName with a cleaner name.
exports.FunctionName = InternalModule_FunctionName;
}

Но я сталкиваюсь с проблемой при попытке использовать JSDo c в этой ситуации. В идеале я должен иметь возможность написать один комментарий к документации, чтобы охватить оба случая, поскольку InternalModule_FunctionName и <module>.FunctionName - это одна и та же функция, только с разными именами в зависимости от контекста использования модуля. Моя первая надежда состояла в том, чтобы иметь возможность указать как внешнее, так и внутреннее имя для функции, но это не представляется возможным в JSDo c. Это на первый взгляд идеальный сценарий для тега @alias, но, похоже, он тоже не работает, и я попробовал его всеми возможными способами. Я пробовал все возможные комбинации других тегов, которые, как я надеялся, могут помочь, например @borrows, @lends и так далее: все безрезультатно. В частности, моя первая попытка:

//#Global Variables
var Logger = { 
    log: () => {
        return null;
    }
};
/**
* @function Logger_Set
* @alias SetLogger
* @access public
* @description Allows this module's functions to log the given logger object.
* @param {?object} logger - The logger to be used for logging or `null` to disable logging.
* @throws {TypeError} `ERR_INVALID_ARG_TYPE` if logger is not an object or `null`. 
* @since v0.0.0
*/
function Logger_Set( logger ){
    var return_error = null;
    const FUNCTION_NAME = 'Logger_Set';
    //Variables
    //Parametre checks
    if( typeof(logger) === 'object' ){
        if( logger === null ){
            logger = { 
                log: () => {
                    return null;
                }
            };
        }
    } else{
        return_error = new TypeError('Param "logger" is not an object.');
        return_error.code = ERR_INVALID_ARG_TYPE;
        throw return_error;
    }
    //Function
    Logger = logger;
    //Return
}
//#Exports and Execution
if(require.main === module){
} else{
/**
* @function SetLogger
*/
    exports.SetLogger = Logger_Set;
}

дает мне (как уценка для краткости):

* [ModuleName](#module_ModuleName)
    * [~Logger_Set(logger)](#module_ModuleName..Logger_Set)
    * [~SetLogger()](#module_ModuleName..SetLogger)

<a name="module_ModuleName..Logger_Set"></a>

### ModuleName~Logger\_Set(logger)
Allows this module's functions to log the given logger object.

**Kind**: inner method of [<code>ModuleName</code>](#module_ModuleName)  
**Throws**:

- <code>TypeError</code> `ERR_INVALID_ARG_TYPE` if logger is not an object or `null`.

**Access**: public  
**Since**: v0.0.0  

| Param | Type | Description |
| --- | --- | --- |
| logger | <code>object</code> | The logger to be used for logging or `null` to disable logging. |

<a name="module_ModuleName..SetLogger"></a>

### ModuleName~SetLogger()
**Kind**: inner method of [<code>ModuleName</code>](#module_ModuleName)
//#Global Variables
var Logger = { 
    log: () => {
        return null;
    }
};
/**
* @function Logger_Set
* @access public
* @description Allows this module's functions to log the given logger object.
* @param {?object} logger - The logger to be used for logging or `null` to disable logging.
* @throws {TypeError} `ERR_INVALID_ARG_TYPE` if logger is not an object or `null`. 
* @since v0.0.0
*/
function Logger_Set( logger ){
    var return_error = null;
    const FUNCTION_NAME = 'Logger_Set';
    //Variables
    //Parametre checks
    if( typeof(logger) === 'object' ){
        if( logger === null ){
            logger = { 
                log: () => {
                    return null;
                }
            };
        }
    } else{
        return_error = new TypeError('Param "logger" is not an object.');
        return_error.code = ERR_INVALID_ARG_TYPE;
        throw return_error;
    }
    //Function
    Logger = logger;
    //Return
}
//#Exports and Execution
if(require.main === module){
} else{
/**
* @function SetLogger
* @alias Logger_Set
*/
    exports.SetLogger = Logger_Set;
}

дает

## Functions

<dl>
<dt><a href="#Logger_Set">Logger_Set(logger)</a></dt>
<dd><p>Allows this module&#39;s functions to log the given logger object.</p>
</dd>
<dt><a href="#SetLogger">SetLogger()</a></dt>
<dd></dd>
</dl>

<a name="Logger_Set"></a>

## Logger\_Set(logger)
Allows this module's functions to log the given logger object.

**Kind**: global function  
**Throws**:

- <code>TypeError</code> `ERR_INVALID_ARG_TYPE` if logger is not an object or `null`.

**Access**: public  
**Since**: v0.0.0  

| Param | Type | Description |
| --- | --- | --- |
| logger | <code>object</code> | The logger to be used for logging or `null` to disable logging. |

<a name="SetLogger"></a>

## SetLogger()
**Kind**: global function  
//#Global Variables
var Logger = { 
    log: () => {
        return null;
    }
};
/**
* @function Logger_Set
* @access public
* @description Allows this module's functions to log the given logger object.
* @param {?object} logger - The logger to be used for logging or `null` to disable logging.
* @throws {TypeError} `ERR_INVALID_ARG_TYPE` if logger is not an object or `null`. 
* @since v0.0.0
*/
function Logger_Set( logger ){
    var return_error = null;
    const FUNCTION_NAME = 'Logger_Set';
    //Variables
    //Parametre checks
    if( typeof(logger) === 'object' ){
        if( logger === null ){
            logger = { 
                log: () => {
                    return null;
                }
            };
        }
    } else{
        return_error = new TypeError('Param "logger" is not an object.');
        return_error.code = ERR_INVALID_ARG_TYPE;
        throw return_error;
    }
    //Function
    Logger = logger;
    //Return
}
//#Exports and Execution
if(require.main === module){
} else{
/**
* @name SetLogger
* @alias Logger_Set
*/
    exports.SetLogger = Logger_Set;
}

дает

## Members

<dl>
<dt><a href="#SetLogger">SetLogger</a></dt>
<dd></dd>
</dl>

## Functions

<dl>
<dt><a href="#Logger_Set">Logger_Set(logger)</a></dt>
<dd><p>Allows this module&#39;s functions to log the given logger object.</p>
</dd>
</dl>

<a name="SetLogger"></a>

## SetLogger
**Kind**: global variable  
<a name="Logger_Set"></a>

## Logger\_Set(logger)
Allows this module's functions to log the given logger object.

**Kind**: global function  
**Throws**:

- <code>TypeError</code> `ERR_INVALID_ARG_TYPE` if logger is not an object or `null`.

**Access**: public  
**Since**: v0.0.0  

| Param | Type | Description |
| --- | --- | --- |
| logger | <code>object</code> | The logger to be used for logging or `null` to disable logging. |

//#Global Variables
var Logger = { 
    log: () => {
        return null;
    }
};
/**
* @function Logger_Set
* @access public
* @description Allows this module's functions to log the given logger object.
* @param {?object} logger - The logger to be used for logging or `null` to disable logging.
* @throws {TypeError} `ERR_INVALID_ARG_TYPE` if logger is not an object or `null`. 
* @since v0.0.0
*/
function Logger_Set( logger ){
    var return_error = null;
    const FUNCTION_NAME = 'Logger_Set';
    //Variables
    //Parametre checks
    if( typeof(logger) === 'object' ){
        if( logger === null ){
            logger = { 
                log: () => {
                    return null;
                }
            };
        }
    } else{
        return_error = new TypeError('Param "logger" is not an object.');
        return_error.code = ERR_INVALID_ARG_TYPE;
        throw return_error;
    }
    //Function
    Logger = logger;
    //Return
}
//#Exports and Execution
if(require.main === module){
} else{
/**
* @name SetLogger
* @borrows Logger_Set as SetLogger
*/
    exports.SetLogger = Logger_Set;
}

дает

## Members

<dl>
<dt><a href="#SetLogger">SetLogger</a></dt>
<dd></dd>
</dl>

## Functions

<dl>
<dt><a href="#Logger_Set">Logger_Set(logger)</a></dt>
<dd><p>Allows this module&#39;s functions to log the given logger object.</p>
</dd>
</dl>

<a name="SetLogger"></a>

## SetLogger
**Kind**: global variable  
<a name="SetLogger.SetLogger"></a>

### SetLogger.SetLogger(logger)
Allows this module's functions to log the given logger object.

**Kind**: static method of [<code>SetLogger</code>](#SetLogger)  
**Throws**:

- <code>TypeError</code> `ERR_INVALID_ARG_TYPE` if logger is not an object or `null`.

**Access**: public  
**Since**: v0.0.0  

| Param | Type | Description |
| --- | --- | --- |
| logger | <code>object</code> | The logger to be used for logging or `null` to disable logging. |

<a name="Logger_Set"></a>

## Logger\_Set(logger)
Allows this module's functions to log the given logger object.

**Kind**: global function  
**Throws**:

- <code>TypeError</code> `ERR_INVALID_ARG_TYPE` if logger is not an object or `null`.

**Access**: public  
**Since**: v0.0.0  

| Param | Type | Description |
| --- | --- | --- |
| logger | <code>object</code> | The logger to be used for logging or `null` to disable logging. |

и десятки других перестановок тегов @function @property @name @alias @export @borrows @ все без какого-либо успеха .

Tl; dr : Как у вас есть функции с двумя разными именами, которые ссылаются на одну и ту же документацию?

...