Files
kami-parse-server/src/Deprecator/Deprecator.js
2021-07-12 20:14:35 +02:00

119 lines
4.5 KiB
JavaScript

import logger from '../logger';
import Deprecations from './Deprecations';
/**
* The deprecator class.
*/
class Deprecator {
/**
* Scans the Parse Server for deprecated options.
* This needs to be called before setting option defaults, otherwise it
* becomes indistinguishable whether an option has been set manually or
* by default.
* @param {any} options The Parse Server options.
*/
static scanParseServerOptions(options) {
// Scan for deprecations
for (const deprecation of Deprecator._getDeprecations()) {
// Get deprecation properties
const solution = deprecation.solution;
const optionKey = deprecation.optionKey;
const changeNewDefault = deprecation.changeNewDefault;
// If default will change, only throw a warning if option is not set
if (changeNewDefault != null && options[optionKey] == null) {
Deprecator._logOption({ optionKey, changeNewDefault, solution });
}
}
}
/**
* Logs a deprecation warning for a parameter that can only be determined dynamically
* during runtime.
*
* Note: Do not use this to log deprecations of Parse Server options, but add such
* deprecations to `Deprecations.js` instead. See the contribution docs for more
* details.
*
* For consistency, the deprecation warning is composed of the following parts:
*
* > DeprecationWarning: `usage` is deprecated and will be removed in a future version.
* `solution`.
*
* - `usage`: The deprecated usage.
* - `solution`: The instruction to resolve this deprecation warning.
*
* For example:
* > DeprecationWarning: `Prefixing field names with dollar sign ($) in aggregation query`
* is deprecated and will be removed in a future version. `Reference field names without
* dollar sign prefix.`
*
* @param {Object} options The deprecation options.
* @param {String} options.usage The usage that is deprecated.
* @param {String} [options.solution] The instruction to resolve this deprecation warning.
* Optional. It is recommended to add an instruction for the convenience of the developer.
*/
static logRuntimeDeprecation(options) {
Deprecator._logGeneric(options);
}
/**
* Returns the deprecation definitions.
* @returns {Array<Object>} The deprecations.
*/
static _getDeprecations() {
return Deprecations;
}
/**
* Logs a generic deprecation warning.
*
* @param {Object} options The deprecation options.
* @param {String} options.usage The usage that is deprecated.
* @param {String} [options.solution] The instruction to resolve this deprecation warning.
* Optional. It is recommended to add an instruction for the convenience of the developer.
*/
static _logGeneric({ usage, solution }) {
// Compose message
let output = `DeprecationWarning: ${usage} is deprecated and will be removed in a future version.`;
output += solution ? ` ${solution}` : '';
logger.warn(output);
}
/**
* Logs a deprecation warning for a Parse Server option.
*
* @param {String} optionKey The option key incl. its path, e.g. `security.enableCheck`.
* @param {String} envKey The environment key, e.g. `PARSE_SERVER_SECURITY`.
* @param {String} changeNewKey Set the new key name if the current key will be replaced,
* or set to an empty string if the current key will be removed without replacement.
* @param {String} changeNewDefault Set the new default value if the key's default value
* will change in a future version.
* @param {String} [solution] The instruction to resolve this deprecation warning. This
* message must not include the warning that the parameter is deprecated, that is
* automatically added to the message. It should only contain the instruction on how
* to resolve this warning.
*/
static _logOption({ optionKey, envKey, changeNewKey, changeNewDefault, solution }) {
const type = optionKey ? 'option' : 'environment key';
const key = optionKey ? optionKey : envKey;
const keyAction =
changeNewKey == null
? undefined
: changeNewKey.length > 0
? `renamed to '${changeNewKey}'`
: `removed`;
// Compose message
let output = `DeprecationWarning: The Parse Server ${type} '${key}' `;
output += changeNewKey ? `is deprecated and will be ${keyAction} in a future version.` : '';
output += changeNewDefault
? `default will change to '${changeNewDefault}' in a future version.`
: '';
output += solution ? ` ${solution}` : '';
logger.warn(output);
}
}
module.exports = Deprecator;