ran-boilerplate
Version:
React . Apollo (GraphQL) . Next.js Toolkit
120 lines (112 loc) • 3.6 kB
text/typescript
/**
* Copyright 2017 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Check to make sure the appropriate number of arguments are provided for a public function.
* Throws an error if it fails.
*
* @param {!string} fnName The function name
* @param {!number} minCount The minimum number of arguments to allow for the function call
* @param {!number} maxCount The maximum number of argument to allow for the function call
* @param {!number} argCount The actual number of arguments provided.
*/
export const validateArgCount = function(fnName, minCount, maxCount, argCount) {
var argError;
if (argCount < minCount) {
argError = 'at least ' + minCount;
} else if (argCount > maxCount) {
argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;
}
if (argError) {
var error =
fnName +
' failed: Was called with ' +
argCount +
(argCount === 1 ? ' argument.' : ' arguments.') +
' Expects ' +
argError +
'.';
throw new Error(error);
}
};
/**
* Generates a string to prefix an error message about failed argument validation
*
* @param {!string} fnName The function name
* @param {!number} argumentNumber The index of the argument
* @param {boolean} optional Whether or not the argument is optional
* @return {!string} The prefix to add to the error thrown for validation.
*/
export function errorPrefix(fnName, argumentNumber, optional) {
var argName = '';
switch (argumentNumber) {
case 1:
argName = optional ? 'first' : 'First';
break;
case 2:
argName = optional ? 'second' : 'Second';
break;
case 3:
argName = optional ? 'third' : 'Third';
break;
case 4:
argName = optional ? 'fourth' : 'Fourth';
break;
default:
throw new Error(
'errorPrefix called with argumentNumber > 4. Need to update it?'
);
}
var error = fnName + ' failed: ';
error += argName + ' argument ';
return error;
}
/**
* @param {!string} fnName
* @param {!number} argumentNumber
* @param {!string} namespace
* @param {boolean} optional
*/
export function validateNamespace(fnName, argumentNumber, namespace, optional) {
if (optional && !namespace) return;
if (typeof namespace !== 'string') {
//TODO: I should do more validation here. We only allow certain chars in namespaces.
throw new Error(
errorPrefix(fnName, argumentNumber, optional) +
'must be a valid firebase namespace.'
);
}
}
export function validateCallback(fnName, argumentNumber, callback, optional) {
if (optional && !callback) return;
if (typeof callback !== 'function')
throw new Error(
errorPrefix(fnName, argumentNumber, optional) +
'must be a valid function.'
);
}
export function validateContextObject(
fnName,
argumentNumber,
context,
optional
) {
if (optional && !context) return;
if (typeof context !== 'object' || context === null)
throw new Error(
errorPrefix(fnName, argumentNumber, optional) +
'must be a valid context object.'
);
}