-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
111 lines (96 loc) · 1.97 KB
/
index.js
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
const format = require('quick-format-unescaped')
class Nanoerror extends Error {
/**
* @readonly
* @static
* @returns {string}
*/
static get code () {
return this.name
}
/**
* @readonly
* @static
* @returns {boolean}
*/
static get isNanoerror () {
return true
}
/**
* @static
* @param {Nanoerror} err
* @returns {boolean}
*/
static equals (err) {
return err.isNanoerror && err.code === this.code
}
/**
* Creates a new Error
* @param {...any} [args]
*/
constructor (...args) {
super()
// get information from static props
const self = /** @type {typeof Nanoerror} */(this.constructor)
const code = self.code
const unformatMessage = self.message
/** @type {string} */
this.message = format(unformatMessage, args)
/** @type {string} */
this.name = code
/** @type {string} */
this.code = this.name
/** @type {Array<any>} */
this.args = args
/** @type {string} */
this.unformatMessage = unformatMessage
if ('captureStackTrace' in Error) {
Error.captureStackTrace(this, this.constructor)
}
}
/**
* @readonly
* @returns {boolean}
*/
get isNanoerror () {
return true
}
/**
* @param {Nanoerror} err
* @returns {boolean}
*/
equals (err) {
return err.isNanoerror && err.code === this.code
}
}
/**
* @type {string}
* @static
* @memberof Nanoerror
*/
Nanoerror.message = ''
/**
* Creates a new Error class
*
* @param {string} code
* @param {string} message
*/
function createError (code, message = '%s') {
const obj = {
[code]: class extends Nanoerror {
/**
* @static
* @param {Error} err
* @returns {Nanoerror}
*/
static from (err) {
const newErr = new obj[code](`[${err.toString()}]`)
newErr.stack = err.stack || newErr.stack
return newErr
}
}
}
obj[code].message = message
return obj[code]
}
module.exports = createError