error.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. const {EOL} = require('os');
  2. const {addInspection, messageGap} = require('./utils');
  3. const parsingErrorCode = {
  4. unclosedMLC: 0, // Unclosed multi-line comment.
  5. unclosedText: 1, // Unclosed text block.
  6. unclosedQI: 2, // Unclosed quoted identifier.
  7. multiLineQI: 3 // Multi-line quoted identifiers are not supported.
  8. };
  9. Object.freeze(parsingErrorCode);
  10. const errorMessages = [
  11. {name: 'unclosedMLC', message: 'Unclosed multi-line comment.'},
  12. {name: 'unclosedText', message: 'Unclosed text block.'},
  13. {name: 'unclosedQI', message: 'Unclosed quoted identifier.'},
  14. {name: 'multiLineQI', message: 'Multi-line quoted identifiers are not supported.'}
  15. ];
  16. class SQLParsingError extends Error {
  17. constructor(code, position) {
  18. const err = errorMessages[code].message;
  19. const message = `Error parsing SQL at {line:${position.line},col:${position.column}}: ${err}`;
  20. super(message);
  21. this.name = this.constructor.name;
  22. this.error = err;
  23. this.code = code;
  24. this.position = position;
  25. Error.captureStackTrace(this, this.constructor);
  26. }
  27. }
  28. SQLParsingError.prototype.toString = function (level) {
  29. level = level > 0 ? parseInt(level) : 0;
  30. const gap = messageGap(level + 1);
  31. const lines = [
  32. `SQLParsingError {`,
  33. `${gap}code: parsingErrorCode.${errorMessages[this.code].name}`,
  34. `${gap}error: "${this.error}"`,
  35. `${gap}position: {line: ${this.position.line}, col: ${this.position.column}}`,
  36. `${messageGap(level)}}`
  37. ];
  38. return lines.join(EOL);
  39. };
  40. addInspection(SQLParsingError.prototype, function () {
  41. return this.toString();
  42. });
  43. module.exports = {
  44. SQLParsingError,
  45. parsingErrorCode
  46. };