@naturalcycles/nodejs-lib
Version:
Standard library for Node.js
97 lines (96 loc) • 4.32 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.savedDBEntitySchema = exports.baseDBEntitySchema = exports.ipAddressSchema = exports.utcOffsetSchema = exports.userAgentSchema = exports.semVerSchema = exports.SEM_VER_PATTERN = exports.emailSchema = exports.verSchema = exports.unixTimestampMillis2000Schema = exports.unixTimestampMillisSchema = exports.unixTimestamp2000Schema = exports.unixTimestampSchema = exports.slugSchema = exports.SLUG_PATTERN = exports.idSchema = exports.anyObjectSchema = exports.anySchema = exports.oneOfSchema = exports.objectSchema = exports.arraySchema = exports.urlSchema = exports.binarySchema = exports.dateStringSchema = exports.percentageSchema = exports.integerSchema = exports.numberSchema = exports.stringSchema = exports.booleanDefaultToFalseSchema = exports.booleanSchema = void 0;
const joi_extensions_1 = require("./joi.extensions");
exports.booleanSchema = joi_extensions_1.Joi.boolean();
exports.booleanDefaultToFalseSchema = joi_extensions_1.Joi.boolean().default(false);
exports.stringSchema = joi_extensions_1.Joi.string();
exports.numberSchema = joi_extensions_1.Joi.number();
exports.integerSchema = joi_extensions_1.Joi.number().integer();
exports.percentageSchema = joi_extensions_1.Joi.number().integer().min(0).max(100);
exports.dateStringSchema = exports.stringSchema.dateString();
exports.binarySchema = joi_extensions_1.Joi.binary();
const urlSchema = (scheme = 'https') => joi_extensions_1.Joi.string().uri({ scheme });
exports.urlSchema = urlSchema;
function arraySchema(items) {
return items ? joi_extensions_1.Joi.array().items(items) : joi_extensions_1.Joi.array();
}
exports.arraySchema = arraySchema;
function objectSchema(schema) {
return joi_extensions_1.Joi.object(schema);
}
exports.objectSchema = objectSchema;
function oneOfSchema(...schemas) {
return joi_extensions_1.Joi.alternatives(schemas);
}
exports.oneOfSchema = oneOfSchema;
exports.anySchema = joi_extensions_1.Joi.any();
exports.anyObjectSchema = joi_extensions_1.Joi.object().options({ stripUnknown: false });
// 1g498efj5sder3324zer
/**
* [a-zA-Z0-9_]*
* 6-64 length
*/
exports.idSchema = exports.stringSchema.regex(/^[a-zA-Z0-9_]{6,64}$/);
/**
* `_` should NOT be allowed to be able to use slug-ids as part of natural ids with `_` separator.
*/
exports.SLUG_PATTERN = /^[a-z0-9-]*$/;
/**
* "Slug" - a valid URL, filename, etc.
*/
exports.slugSchema = exports.stringSchema.regex(/^[a-z0-9-]{1,255}$/);
const TS_2500 = 16725225600; // 2500-01-01
const TS_2000 = 946684800; // 2000-01-01
/**
* Between years 1970 and 2050
*/
exports.unixTimestampSchema = exports.numberSchema.integer().min(0).max(TS_2500);
/**
* Between years 2000 and 2050
*/
exports.unixTimestamp2000Schema = exports.numberSchema.integer().min(0).min(TS_2000).max(TS_2500);
/**
* Between years 1970 and 2050
*/
exports.unixTimestampMillisSchema = exports.numberSchema
.integer()
.min(0)
.max(TS_2500 * 1000);
/**
* Between years 2000 and 2050
*/
exports.unixTimestampMillis2000Schema = exports.numberSchema
.integer()
.min(TS_2000 * 1000)
.max(TS_2500 * 1000);
// 2
exports.verSchema = exports.numberSchema.optional().integer().min(1).max(100);
/**
* Be careful, by default emailSchema does TLD validation. To disable it - use `stringSchema.email({tld: false}).lowercase()`
*/
exports.emailSchema = exports.stringSchema.email().lowercase();
/**
* Pattern is simplified for our use, it's not a canonical SemVer.
*/
exports.SEM_VER_PATTERN = /^[0-9]+\.[0-9]+\.[0-9]+$/;
exports.semVerSchema = exports.stringSchema.regex(exports.SEM_VER_PATTERN);
// todo: .error(() => 'should be SemVer')
exports.userAgentSchema = exports.stringSchema
.min(5) // I've seen UA of `Android` (7 characters)
.max(400);
exports.utcOffsetSchema = exports.numberSchema
.min(-14 * 60)
.max(14 * 60)
.dividable(15);
exports.ipAddressSchema = exports.stringSchema.ip();
exports.baseDBEntitySchema = objectSchema({
id: exports.stringSchema.optional(),
created: exports.unixTimestamp2000Schema.optional(),
updated: exports.unixTimestamp2000Schema.optional(),
});
exports.savedDBEntitySchema = objectSchema({
id: exports.stringSchema,
created: exports.unixTimestamp2000Schema,
updated: exports.unixTimestamp2000Schema,
});