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.
57 lines
1.3 KiB
57 lines
1.3 KiB
// @flow
|
|
|
|
// based on https://github.com/styled-components/styled-components/blob/fcf6f3804c57a14dd7984dfab7bc06ee2edca044/src/utils/error.js
|
|
|
|
declare var preval: Function
|
|
|
|
/**
|
|
* Parse errors.md and turn it into a simple hash of code: message
|
|
* @private
|
|
*/
|
|
const ERRORS = preval`
|
|
const fs = require('fs');
|
|
const md = fs.readFileSync(__dirname + '/errors.md', 'utf8');
|
|
module.exports = md.split(/^#/gm).slice(1).reduce((errors, str) => {
|
|
const [, code, message] = str.split(/^.*?(\\d+)\\s*\\n/)
|
|
errors[code] = message
|
|
return errors;
|
|
}, {});
|
|
`
|
|
|
|
/**
|
|
* super basic version of sprintf
|
|
* @private
|
|
*/
|
|
function format(...args) {
|
|
let a = args[0]
|
|
const b = []
|
|
let c
|
|
|
|
for (c = 1; c < args.length; c += 1) {
|
|
b.push(args[c])
|
|
}
|
|
|
|
b.forEach(d => {
|
|
a = a.replace(/%[a-z]/, d)
|
|
})
|
|
|
|
return a
|
|
}
|
|
|
|
/**
|
|
* Create an error file out of errors.md for development and a simple web link to the full errors
|
|
* in production mode.
|
|
* @private
|
|
*/
|
|
export default class PolishedError extends Error {
|
|
constructor(code: string | number, ...args: Array<any>) {
|
|
if (process.env.NODE_ENV === 'production') {
|
|
super(
|
|
`An error occurred. See https://github.com/styled-components/polished/blob/main/src/internalHelpers/errors.md#${code} for more information.`,
|
|
)
|
|
} else {
|
|
super(format(ERRORS[code], ...args))
|
|
}
|
|
}
|
|
}
|