You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.3 KiB
130 lines
3.3 KiB
2 years ago
|
'use strict'
|
||
|
const { inspect } = require('util')
|
||
|
|
||
|
// adapted from node's internal/errors
|
||
|
// https://github.com/nodejs/node/blob/c8a04049/lib/internal/errors.js
|
||
|
|
||
|
// close copy of node's internal SystemError class.
|
||
|
class SystemError {
|
||
|
constructor (code, prefix, context) {
|
||
|
// XXX context.code is undefined in all constructors used in cp/polyfill
|
||
|
// that may be a bug copied from node, maybe the constructor should use
|
||
|
// `code` not `errno`? nodejs/node#41104
|
||
|
let message = `${prefix}: ${context.syscall} returned ` +
|
||
|
`${context.code} (${context.message})`
|
||
|
|
||
|
if (context.path !== undefined) {
|
||
|
message += ` ${context.path}`
|
||
|
}
|
||
|
if (context.dest !== undefined) {
|
||
|
message += ` => ${context.dest}`
|
||
|
}
|
||
|
|
||
|
this.code = code
|
||
|
Object.defineProperties(this, {
|
||
|
name: {
|
||
|
value: 'SystemError',
|
||
|
enumerable: false,
|
||
|
writable: true,
|
||
|
configurable: true,
|
||
|
},
|
||
|
message: {
|
||
|
value: message,
|
||
|
enumerable: false,
|
||
|
writable: true,
|
||
|
configurable: true,
|
||
|
},
|
||
|
info: {
|
||
|
value: context,
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: false,
|
||
|
},
|
||
|
errno: {
|
||
|
get () {
|
||
|
return context.errno
|
||
|
},
|
||
|
set (value) {
|
||
|
context.errno = value
|
||
|
},
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
},
|
||
|
syscall: {
|
||
|
get () {
|
||
|
return context.syscall
|
||
|
},
|
||
|
set (value) {
|
||
|
context.syscall = value
|
||
|
},
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
},
|
||
|
})
|
||
|
|
||
|
if (context.path !== undefined) {
|
||
|
Object.defineProperty(this, 'path', {
|
||
|
get () {
|
||
|
return context.path
|
||
|
},
|
||
|
set (value) {
|
||
|
context.path = value
|
||
|
},
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
if (context.dest !== undefined) {
|
||
|
Object.defineProperty(this, 'dest', {
|
||
|
get () {
|
||
|
return context.dest
|
||
|
},
|
||
|
set (value) {
|
||
|
context.dest = value
|
||
|
},
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
toString () {
|
||
|
return `${this.name} [${this.code}]: ${this.message}`
|
||
|
}
|
||
|
|
||
|
[Symbol.for('nodejs.util.inspect.custom')] (_recurseTimes, ctx) {
|
||
|
return inspect(this, {
|
||
|
...ctx,
|
||
|
getters: true,
|
||
|
customInspect: false,
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function E (code, message) {
|
||
|
module.exports[code] = class NodeError extends SystemError {
|
||
|
constructor (ctx) {
|
||
|
super(code, message, ctx)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
E('ERR_FS_CP_DIR_TO_NON_DIR', 'Cannot overwrite directory with non-directory')
|
||
|
E('ERR_FS_CP_EEXIST', 'Target already exists')
|
||
|
E('ERR_FS_CP_EINVAL', 'Invalid src or dest')
|
||
|
E('ERR_FS_CP_FIFO_PIPE', 'Cannot copy a FIFO pipe')
|
||
|
E('ERR_FS_CP_NON_DIR_TO_DIR', 'Cannot overwrite non-directory with directory')
|
||
|
E('ERR_FS_CP_SOCKET', 'Cannot copy a socket file')
|
||
|
E('ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY', 'Cannot overwrite symlink in subdirectory of self')
|
||
|
E('ERR_FS_CP_UNKNOWN', 'Cannot copy an unknown file type')
|
||
|
E('ERR_FS_EISDIR', 'Path is a directory')
|
||
|
|
||
|
module.exports.ERR_INVALID_ARG_TYPE = class ERR_INVALID_ARG_TYPE extends Error {
|
||
|
constructor (name, expected, actual) {
|
||
|
super()
|
||
|
this.code = 'ERR_INVALID_ARG_TYPE'
|
||
|
this.message = `The ${name} argument must be ${expected}. Received ${typeof actual}`
|
||
|
}
|
||
|
}
|