123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- 'use strict';
- const Assert = require('@hapi/hoek/lib/assert');
- const AssertError = require('@hapi/hoek/lib/error');
- const Pkg = require('../package.json');
- let Messages;
- let Schemas;
- const internals = {
- isoDate: /^(?:[-+]\d{2})?(?:\d{4}(?!\d{2}\b))(?:(-?)(?:(?:0[1-9]|1[0-2])(?:\1(?:[12]\d|0[1-9]|3[01]))?|W(?:[0-4]\d|5[0-2])(?:-?[1-7])?|(?:00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[1-6])))(?![T]$|[T][\d]+Z$)(?:[T\s](?:(?:(?:[01]\d|2[0-3])(?:(:?)[0-5]\d)?|24\:?00)(?:[.,]\d+(?!:))?)(?:\2[0-5]\d(?:[.,]\d+)?)?(?:[Z]|(?:[+-])(?:[01]\d|2[0-3])(?::?[0-5]\d)?)?)?)?$/
- };
- exports.version = Pkg.version;
- exports.defaults = {
- abortEarly: true,
- allowUnknown: false,
- artifacts: false,
- cache: true,
- context: null,
- convert: true,
- dateFormat: 'iso',
- errors: {
- escapeHtml: false,
- label: 'path',
- language: null,
- render: true,
- stack: false,
- wrap: {
- label: '"',
- array: '[]'
- }
- },
- externals: true,
- messages: {},
- nonEnumerables: false,
- noDefaults: false,
- presence: 'optional',
- skipFunctions: false,
- stripUnknown: false,
- warnings: false
- };
- exports.symbols = {
- any: Symbol.for('@hapi/joi/schema'), // Used to internally identify any-based types (shared with other joi versions)
- arraySingle: Symbol('arraySingle'),
- deepDefault: Symbol('deepDefault'),
- errors: Symbol('errors'),
- literal: Symbol('literal'),
- override: Symbol('override'),
- parent: Symbol('parent'),
- prefs: Symbol('prefs'),
- ref: Symbol('ref'),
- template: Symbol('template'),
- values: Symbol('values')
- };
- exports.assertOptions = function (options, keys, name = 'Options') {
- Assert(options && typeof options === 'object' && !Array.isArray(options), 'Options must be of type object');
- const unknownKeys = Object.keys(options).filter((k) => !keys.includes(k));
- Assert(unknownKeys.length === 0, `${name} contain unknown keys: ${unknownKeys}`);
- };
- exports.checkPreferences = function (prefs) {
- Schemas = Schemas || require('./schemas');
- const result = Schemas.preferences.validate(prefs);
- if (result.error) {
- throw new AssertError([result.error.details[0].message]);
- }
- };
- exports.compare = function (a, b, operator) {
- switch (operator) {
- case '=': return a === b;
- case '>': return a > b;
- case '<': return a < b;
- case '>=': return a >= b;
- case '<=': return a <= b;
- }
- };
- exports.default = function (value, defaultValue) {
- return value === undefined ? defaultValue : value;
- };
- exports.isIsoDate = function (date) {
- return internals.isoDate.test(date);
- };
- exports.isNumber = function (value) {
- return typeof value === 'number' && !isNaN(value);
- };
- exports.isResolvable = function (obj) {
- if (!obj) {
- return false;
- }
- return obj[exports.symbols.ref] || obj[exports.symbols.template];
- };
- exports.isSchema = function (schema, options = {}) {
- const any = schema && schema[exports.symbols.any];
- if (!any) {
- return false;
- }
- Assert(options.legacy || any.version === exports.version, 'Cannot mix different versions of joi schemas');
- return true;
- };
- exports.isValues = function (obj) {
- return obj[exports.symbols.values];
- };
- exports.limit = function (value) {
- return Number.isSafeInteger(value) && value >= 0;
- };
- exports.preferences = function (target, source) {
- Messages = Messages || require('./messages');
- target = target || {};
- source = source || {};
- const merged = Object.assign({}, target, source);
- if (source.errors &&
- target.errors) {
- merged.errors = Object.assign({}, target.errors, source.errors);
- merged.errors.wrap = Object.assign({}, target.errors.wrap, source.errors.wrap);
- }
- if (source.messages) {
- merged.messages = Messages.compile(source.messages, target.messages);
- }
- delete merged[exports.symbols.prefs];
- return merged;
- };
- exports.tryWithPath = function (fn, key, options = {}) {
- try {
- return fn();
- }
- catch (err) {
- if (err.path !== undefined) {
- err.path = key + '.' + err.path;
- }
- else {
- err.path = key;
- }
- if (options.append) {
- err.message = `${err.message} (${err.path})`;
- }
- throw err;
- }
- };
- exports.validateArg = function (value, label, { assert, message }) {
- if (exports.isSchema(assert)) {
- const result = assert.validate(value);
- if (!result.error) {
- return;
- }
- return result.error.message;
- }
- else if (!assert(value)) {
- return label ? `${label} ${message}` : message;
- }
- };
- exports.verifyFlat = function (args, method) {
- for (const arg of args) {
- Assert(!Array.isArray(arg), 'Method no longer accepts array arguments:', method);
- }
- };
|