index.js
1.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
'use strict'
/*
* indicative
*
* (c) Harminder Virk <virk@adonisjs.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
module.exports = {
list: new Map(),
defaultFormatter: null,
/**
* Returns the formatter instance using it's name
*
* @method get
*
* @param {String} name
*
* @return {Object}
*/
get (name) {
const Formatter = this.list.get(name || this.defaultFormatter)
if (!Formatter) {
throw new Error(`Cannot find formatter for ${name}. Make sure to register it first`)
}
return new Formatter()
},
/**
* Set the formatter to be used by default
*
* @method default
*
* @param {String} name
*
* @chainable
*/
default (name) {
this.defaultFormatter = name
},
/**
* Registers a new formatter to the list. Also will override
* the old one silently if names are same.
*
* @method register
*
* @param {String} name
* @param {Class} implementation
*
* @chainable
*/
register (name, implementation) {
if (typeof (implementation) !== 'function' || !implementation.prototype) {
throw new Error('Make sure to register a valid ES6 class')
}
if (typeof (implementation.prototype.addError) !== 'function' || typeof (implementation.prototype.toJSON) !== 'function') {
throw new Error('Formatter must have {addError} and {toJSON} methods on it')
}
this.list.set(name, implementation)
return this
}
}