UNPKG

1.52 kBJavaScriptView Raw
1/**
2 * @copyright Copyright (c) 2019 Maxim Khorin <maksimovichu@gmail.com>
3 */
4'use strict';
5
6const Base = require('./Validator');
7
8module.exports = class UrlValidator extends Base {
9
10 constructor (config) {
11 super({
12 pattern: '^{schemes}:\\/\\/(([A-Z0-9][A-Z0-9_-]*)(\\.[A-Z0-9][A-Z0-9_-]*)+)',
13 validSchemes: ['http', 'https'],
14 defaultScheme: null,
15 maxLength: 2000,
16 ...config
17 });
18 }
19
20 getMessage () {
21 return this.createMessage(this.message, 'Invalid url');
22 }
23
24 async validateAttr (attr, model) {
25 const value = model.get(attr);
26 const message = await this.validateValue(value);
27 if (message) {
28 this.addError(model, attr, message);
29 } else if (this.defaultScheme !== null && !value.includes('://')) {
30 model.set(attr, `${this.defaultScheme}://${value}`);
31 }
32 }
33
34 validateValue (value) {
35 if (typeof value !== 'string' || value.length > this.maxLength) {
36 return this.getMessage();
37 }
38 if (this.defaultScheme !== null && !value.includes('://')) {
39 value = `${this.defaultScheme}://${value}`;
40 }
41 let pattern = this.pattern;
42 if (pattern.includes('{schemes}')) {
43 pattern = pattern.replace('{schemes}', `(${this.validSchemes.join('|')})`);
44 }
45 return (new RegExp(pattern, 'i')).test(value) ? null : this.getMessage();
46 }
47};
\No newline at end of file