@prairielearn/error 1.2.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.mocharc.cjs ADDED
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ require: ['tsx'],
3
+ };
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @prairielearn/error
2
2
 
3
+ ## 2.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 901fce8: Upgrade all JavaScript dependencies
8
+
9
+ ## 2.0.0
10
+
11
+ ### Major Changes
12
+
13
+ - 4f30b7e: Publish as native ESM
14
+
3
15
  ## 1.2.0
4
16
 
5
17
  ### Minor Changes
package/dist/format.js CHANGED
@@ -1,6 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatErrorStackSafe = exports.formatErrorStack = void 0;
4
1
  function indentString(stack, depth) {
5
2
  if (depth === 0)
6
3
  return stack;
@@ -14,7 +11,7 @@ function indentString(stack, depth) {
14
11
  * Recursively formats an error into a string. Correctly handles both the
15
12
  * `.cause` property and `AggregateError` instances.
16
13
  */
17
- function formatErrorStack(err, depth = 0, prefix = '') {
14
+ export function formatErrorStack(err, depth = 0, prefix = '') {
18
15
  // This will handle both circular references and unnecessarily deep chains.
19
16
  if (depth > 10)
20
17
  return '...';
@@ -34,14 +31,13 @@ function formatErrorStack(err, depth = 0, prefix = '') {
34
31
  }
35
32
  return stack;
36
33
  }
37
- exports.formatErrorStack = formatErrorStack;
38
34
  /**
39
35
  * This is a version of {@link formatErrorStack} that won't error in the case
40
36
  * of an unexpected error object. We'll use the original function if it works,
41
37
  * but if it fails for any reason, we'll just return the plain stack, whatever
42
38
  * it might be.
43
39
  */
44
- function formatErrorStackSafe(err) {
40
+ export function formatErrorStackSafe(err) {
45
41
  try {
46
42
  return formatErrorStack(err);
47
43
  }
@@ -49,5 +45,4 @@ function formatErrorStackSafe(err) {
49
45
  return err.stack;
50
46
  }
51
47
  }
52
- exports.formatErrorStackSafe = formatErrorStackSafe;
53
48
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":";;;AAAA,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;IAChD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,KAAK;SACT,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;SACxC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,GAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,EAAE;IAC/D,2EAA2E;IAC3E,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAE7B,IAAI,KAAK,GAAG,YAAY,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEpD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,IAAI,OAAO,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,KAAK,IAAI,OAAO,MAAM,aAAa,CAAC;QAEpC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,KAAK,IAAI,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,IAAI,MAAM,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,KAAK,IAAI,KAAK,MAAM,GAAG,CAAC;IAC1B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAvBD,4CAuBC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,GAAQ;IAC3C,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;AACH,CAAC;AAND,oDAMC"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;IAChD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,KAAK;SACT,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;SACxC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,EAAE;IAC/D,2EAA2E;IAC3E,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAE7B,IAAI,KAAK,GAAG,YAAY,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEpD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,IAAI,OAAO,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,KAAK,IAAI,OAAO,MAAM,aAAa,CAAC;QAEpC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,KAAK,IAAI,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,IAAI,MAAM,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,KAAK,IAAI,KAAK,MAAM,GAAG,CAAC;IAC1B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAQ;IAC3C,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;AACH,CAAC","sourcesContent":["function indentString(stack: string, depth: number) {\n if (depth === 0) return stack;\n\n const indent = ' '.repeat(depth);\n return stack\n .split('\\n')\n .map((line) => (indent + line).trimEnd())\n .join('\\n');\n}\n\n/**\n * Recursively formats an error into a string. Correctly handles both the\n * `.cause` property and `AggregateError` instances.\n */\nexport function formatErrorStack(err: any, depth = 0, prefix = ''): string {\n // This will handle both circular references and unnecessarily deep chains.\n if (depth > 10) return '...';\n\n let stack = indentString(prefix + err.stack, depth);\n\n if (err.cause) {\n stack += `\\n\\n${formatErrorStack(err.cause, depth + 1, 'Cause: ')}`;\n }\n\n if (err instanceof AggregateError) {\n const indent = ' '.repeat(depth + 1);\n stack += `\\n\\n${indent}Errors: [\\n`;\n\n err.errors.forEach((error, i) => {\n stack += formatErrorStack(error, depth + 2);\n if (i < err.errors.length - 1) stack += '\\n\\n';\n });\n\n stack += `\\n${indent}]`;\n }\n\n return stack;\n}\n\n/**\n * This is a version of {@link formatErrorStack} that won't error in the case\n * of an unexpected error object. We'll use the original function if it works,\n * but if it fails for any reason, we'll just return the plain stack, whatever\n * it might be.\n */\nexport function formatErrorStackSafe(err: any): string {\n try {\n return formatErrorStack(err);\n } catch (e) {\n return err.stack;\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { HtmlSafeString } from '@prairielearn/html';
2
- export { formatErrorStack, formatErrorStackSafe } from './format';
2
+ export { formatErrorStack, formatErrorStackSafe } from './format.js';
3
3
  interface ErrorWithData extends Error {
4
4
  data: any;
5
5
  }
package/dist/index.js CHANGED
@@ -1,49 +1,36 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.HttpStatusError = exports.AugmentedError = exports.augmentError = exports.newMessage = exports.addData = exports.makeWithInfo = exports.makeWithData = exports.make = exports.formatErrorStackSafe = exports.formatErrorStack = void 0;
7
- const lodash_1 = __importDefault(require("lodash"));
8
- var format_1 = require("./format");
9
- Object.defineProperty(exports, "formatErrorStack", { enumerable: true, get: function () { return format_1.formatErrorStack; } });
10
- Object.defineProperty(exports, "formatErrorStackSafe", { enumerable: true, get: function () { return format_1.formatErrorStackSafe; } });
11
- function make(status, message, data) {
1
+ import _ from 'lodash';
2
+ export { formatErrorStack, formatErrorStackSafe } from './format.js';
3
+ export function make(status, message, data) {
12
4
  const err = new Error(message);
13
5
  err.status = status;
14
6
  if (data)
15
7
  err.data = data;
16
8
  return err;
17
9
  }
18
- exports.make = make;
19
- function makeWithData(message, data) {
10
+ export function makeWithData(message, data) {
20
11
  const err = new Error(message);
21
12
  err.data = data;
22
13
  return err;
23
14
  }
24
- exports.makeWithData = makeWithData;
25
- function makeWithInfo(message, info) {
15
+ export function makeWithInfo(message, info) {
26
16
  const err = new Error(message);
27
17
  err.info = info;
28
18
  return err;
29
19
  }
30
- exports.makeWithInfo = makeWithInfo;
31
- function addData(err, data) {
32
- const newErr = (0, lodash_1.default)(err).isError() ? err : new Error(String(err));
20
+ export function addData(err, data) {
21
+ const newErr = (_.isError(err) ? err : new Error(String(err)));
33
22
  newErr.data = newErr.data || {};
34
- lodash_1.default.assign(newErr.data, data);
23
+ _.assign(newErr.data, data);
35
24
  return newErr;
36
25
  }
37
- exports.addData = addData;
38
- function newMessage(err, newMsg) {
39
- const newErr = (0, lodash_1.default)(err).isError() ? err : new Error(String(err));
26
+ export function newMessage(err, newMsg) {
27
+ const newErr = (_.isError(err) ? err : new Error(String(err)));
40
28
  newErr.data = newErr.data || {};
41
29
  newErr.data._previousMessages = newErr.data._previousMessages || [];
42
30
  newErr.data._previousMessages.splice(0, 0, newErr.message);
43
31
  newErr.message = `${newMsg}: ${newErr.message}`;
44
32
  return newErr;
45
33
  }
46
- exports.newMessage = newMessage;
47
34
  /**
48
35
  * Create a new error based an existing one, optionally adding status, message,
49
36
  * and/or data. The existing error will be set as the `cause` of the new error.
@@ -54,7 +41,7 @@ exports.newMessage = newMessage;
54
41
  * @param param.data Data to set on the new error.
55
42
  * @returns The augmented error.
56
43
  */
57
- function augmentError(err, { status, message, data }) {
44
+ export function augmentError(err, { status, message, data }) {
58
45
  let newErr;
59
46
  if (err instanceof Error) {
60
47
  const combinedMessage = message ? `${message}: ${err.message}` : err.message;
@@ -67,8 +54,7 @@ function augmentError(err, { status, message, data }) {
67
54
  newErr.data = data;
68
55
  return newErr;
69
56
  }
70
- exports.augmentError = augmentError;
71
- class AugmentedError extends Error {
57
+ export class AugmentedError extends Error {
72
58
  status;
73
59
  data;
74
60
  info;
@@ -79,13 +65,11 @@ class AugmentedError extends Error {
79
65
  this.info = options.info?.toString();
80
66
  }
81
67
  }
82
- exports.AugmentedError = AugmentedError;
83
- class HttpStatusError extends Error {
68
+ export class HttpStatusError extends Error {
84
69
  status;
85
70
  constructor(status, message) {
86
71
  super(message);
87
72
  this.status = status;
88
73
  }
89
74
  }
90
- exports.HttpStatusError = HttpStatusError;
91
75
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\n\nimport { HtmlSafeString } from '@prairielearn/html';\n\nexport { formatErrorStack, formatErrorStackSafe } from './format.js';\n\ninterface ErrorWithData extends Error {\n data: any;\n}\n\ninterface ErrorWithInfo extends Error {\n info: string;\n}\n\ninterface ErrorWithStatus extends Error {\n status: number;\n}\n\ninterface ErrorWithStatusAndData extends ErrorWithData, ErrorWithStatus {}\n\n// TODO: rename all functions include \"error\" in the name so that they can\n// be more easily imported as named imports.\n\nexport function make(status: number, message: string): ErrorWithStatus;\nexport function make(status: number, message: string, data: any): ErrorWithStatusAndData;\nexport function make(status: number, message: string, data?: any): ErrorWithStatusAndData {\n const err = new Error(message) as ErrorWithStatusAndData;\n err.status = status;\n if (data) err.data = data;\n return err;\n}\n\nexport function makeWithData(message: string, data: any): ErrorWithData {\n const err = new Error(message) as ErrorWithData;\n err.data = data;\n return err;\n}\n\nexport function makeWithInfo(message: string, info: string): ErrorWithInfo {\n const err = new Error(message) as ErrorWithInfo;\n err.info = info;\n return err;\n}\n\nexport function addData(err: any, data: any): ErrorWithData {\n const newErr = (_.isError(err) ? err : new Error(String(err))) as ErrorWithData;\n newErr.data = newErr.data || {};\n _.assign(newErr.data, data);\n return newErr;\n}\n\nexport function newMessage(err: any, newMsg: string): ErrorWithData {\n const newErr = (_.isError(err) ? err : new Error(String(err))) as ErrorWithData;\n newErr.data = newErr.data || {};\n newErr.data._previousMessages = newErr.data._previousMessages || [];\n newErr.data._previousMessages.splice(0, 0, newErr.message);\n newErr.message = `${newMsg}: ${newErr.message}`;\n return newErr;\n}\n\n/**\n * Create a new error based an existing one, optionally adding status, message,\n * and/or data. The existing error will be set as the `cause` of the new error.\n *\n * @param err An existing error.\n * @param param.status Status code to set on the new error.\n * @param param.message Message to add to the new error.\n * @param param.data Data to set on the new error.\n * @returns The augmented error.\n */\nexport function augmentError(\n err: any,\n { status, message, data }: { status?: number; message?: string; data?: any },\n): ErrorWithStatusAndData {\n let newErr: ErrorWithStatusAndData;\n if (err instanceof Error) {\n const combinedMessage = message ? `${message}: ${err.message}` : err.message;\n newErr = new Error(combinedMessage, { cause: err }) as ErrorWithStatusAndData;\n } else {\n newErr = new Error(message ?? String(err)) as ErrorWithStatusAndData;\n }\n newErr.status = status ?? 500;\n newErr.data = data;\n return newErr;\n}\n\nexport interface AugmentedErrorOptions {\n status?: number;\n data?: any;\n info?: HtmlSafeString;\n cause?: unknown;\n}\n\nexport class AugmentedError extends Error {\n status: number;\n data?: any;\n info?: string;\n\n constructor(message: string, options: AugmentedErrorOptions) {\n super(message, { cause: options.cause });\n this.status = options.status ?? 500;\n this.data = options.data;\n this.info = options.info?.toString();\n }\n}\n\nexport class HttpStatusError extends Error {\n status: number;\n\n constructor(status: number, message: string) {\n super(message);\n this.status = status;\n }\n}\n"]}
@@ -1,73 +1,71 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const chai_1 = require("chai");
4
- const index_1 = require("./index");
1
+ import { assert } from 'chai';
2
+ import { make, makeWithData, addData, newMessage, makeWithInfo, augmentError } from './index.js';
5
3
  describe('make', () => {
6
4
  it('makes an error without data', () => {
7
- const err = (0, index_1.make)(404, 'Not Found');
8
- chai_1.assert.equal(err.status, 404);
9
- chai_1.assert.equal(err.message, 'Not Found');
5
+ const err = make(404, 'Not Found');
6
+ assert.equal(err.status, 404);
7
+ assert.equal(err.message, 'Not Found');
10
8
  });
11
9
  it('makes an error with data', () => {
12
- const err = (0, index_1.make)(404, 'Not Found', { foo: 'bar' });
13
- chai_1.assert.equal(err.status, 404);
14
- chai_1.assert.equal(err.message, 'Not Found');
15
- chai_1.assert.equal(err.data.foo, 'bar');
10
+ const err = make(404, 'Not Found', { foo: 'bar' });
11
+ assert.equal(err.status, 404);
12
+ assert.equal(err.message, 'Not Found');
13
+ assert.equal(err.data.foo, 'bar');
16
14
  });
17
15
  });
18
16
  describe('makeWithData', () => {
19
17
  it('makes an error with the expected properties', () => {
20
- const err = (0, index_1.makeWithData)('Not Found', { foo: 'bar' });
21
- chai_1.assert.equal(err.message, 'Not Found');
22
- chai_1.assert.equal(err.data.foo, 'bar');
18
+ const err = makeWithData('Not Found', { foo: 'bar' });
19
+ assert.equal(err.message, 'Not Found');
20
+ assert.equal(err.data.foo, 'bar');
23
21
  });
24
22
  });
25
23
  describe('makeWithInfo', () => {
26
24
  it('makes an error with the expected properties', () => {
27
- const err = (0, index_1.makeWithInfo)('Not Found', 'bar');
28
- chai_1.assert.equal(err.message, 'Not Found');
29
- chai_1.assert.equal(err.info, 'bar');
25
+ const err = makeWithInfo('Not Found', 'bar');
26
+ assert.equal(err.message, 'Not Found');
27
+ assert.equal(err.info, 'bar');
30
28
  });
31
29
  });
32
30
  describe('addData', () => {
33
31
  it('adds data to an error', () => {
34
32
  const err = new Error('Not Found');
35
- const newErr = (0, index_1.addData)(err, { foo: 'bar' });
36
- chai_1.assert.equal(err.message, 'Not Found');
37
- chai_1.assert.equal(err.data.foo, 'bar');
38
- chai_1.assert.equal(newErr.message, 'Not Found');
39
- chai_1.assert.equal(newErr.data.foo, 'bar');
33
+ const newErr = addData(err, { foo: 'bar' });
34
+ assert.equal(err.message, 'Not Found');
35
+ assert.equal(err.data.foo, 'bar');
36
+ assert.equal(newErr.message, 'Not Found');
37
+ assert.equal(newErr.data.foo, 'bar');
40
38
  });
41
39
  it('coerces a non-error to a string', () => {
42
- const newErr = (0, index_1.addData)('Not Found', { foo: 'bar' });
43
- chai_1.assert.equal(newErr.message, 'Not Found');
44
- chai_1.assert.equal(newErr.data.foo, 'bar');
40
+ const newErr = addData('Not Found', { foo: 'bar' });
41
+ assert.equal(newErr.message, 'Not Found');
42
+ assert.equal(newErr.data.foo, 'bar');
45
43
  });
46
44
  });
47
45
  describe('newMessage', () => {
48
46
  it('adds a new message to an error', () => {
49
47
  const err = new Error('Not Found');
50
- const newErr = (0, index_1.newMessage)(err, '404');
51
- chai_1.assert.equal(err.message, '404: Not Found');
52
- chai_1.assert.equal(err.data._previousMessages[0], 'Not Found');
53
- chai_1.assert.equal(newErr.message, '404: Not Found');
54
- chai_1.assert.equal(newErr.data._previousMessages[0], 'Not Found');
48
+ const newErr = newMessage(err, '404');
49
+ assert.equal(err.message, '404: Not Found');
50
+ assert.equal(err.data._previousMessages[0], 'Not Found');
51
+ assert.equal(newErr.message, '404: Not Found');
52
+ assert.equal(newErr.data._previousMessages[0], 'Not Found');
55
53
  });
56
54
  it('coerces a non-error to a string', () => {
57
- const newErr = (0, index_1.newMessage)('Not Found', '404');
58
- chai_1.assert.equal(newErr.message, '404: Not Found');
59
- chai_1.assert.equal(newErr.data._previousMessages[0], 'Not Found');
55
+ const newErr = newMessage('Not Found', '404');
56
+ assert.equal(newErr.message, '404: Not Found');
57
+ assert.equal(newErr.data._previousMessages[0], 'Not Found');
60
58
  });
61
59
  });
62
60
  describe('augmentError', () => {
63
61
  it('adds status, message, and data to an error', () => {
64
62
  const err = new Error('Not Found');
65
- const newErr = (0, index_1.augmentError)(err, { status: 404, message: 'Missing', data: { foo: 'bar' } });
66
- chai_1.assert.equal(newErr.message, 'Missing: Not Found');
67
- chai_1.assert.equal(newErr.status, 404);
68
- chai_1.assert.equal(newErr.data.foo, 'bar');
69
- chai_1.assert.equal(newErr.cause, err);
70
- chai_1.assert.equal(newErr.cause.message, 'Not Found');
63
+ const newErr = augmentError(err, { status: 404, message: 'Missing', data: { foo: 'bar' } });
64
+ assert.equal(newErr.message, 'Missing: Not Found');
65
+ assert.equal(newErr.status, 404);
66
+ assert.equal(newErr.data.foo, 'bar');
67
+ assert.equal(newErr.cause, err);
68
+ assert.equal(newErr.cause.message, 'Not Found');
71
69
  });
72
70
  });
73
71
  //# sourceMappingURL=index.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from 'chai';\n\nimport { make, makeWithData, addData, newMessage, makeWithInfo, augmentError } from './index.js';\n\ndescribe('make', () => {\n it('makes an error without data', () => {\n const err = make(404, 'Not Found');\n assert.equal(err.status, 404);\n assert.equal(err.message, 'Not Found');\n });\n\n it('makes an error with data', () => {\n const err = make(404, 'Not Found', { foo: 'bar' });\n assert.equal(err.status, 404);\n assert.equal(err.message, 'Not Found');\n assert.equal(err.data.foo, 'bar');\n });\n});\n\ndescribe('makeWithData', () => {\n it('makes an error with the expected properties', () => {\n const err = makeWithData('Not Found', { foo: 'bar' });\n assert.equal(err.message, 'Not Found');\n assert.equal(err.data.foo, 'bar');\n });\n});\n\ndescribe('makeWithInfo', () => {\n it('makes an error with the expected properties', () => {\n const err = makeWithInfo('Not Found', 'bar');\n assert.equal(err.message, 'Not Found');\n assert.equal(err.info, 'bar');\n });\n});\n\ndescribe('addData', () => {\n it('adds data to an error', () => {\n const err = new Error('Not Found');\n const newErr = addData(err, { foo: 'bar' });\n\n assert.equal(err.message, 'Not Found');\n assert.equal((err as any).data.foo, 'bar');\n assert.equal(newErr.message, 'Not Found');\n assert.equal(newErr.data.foo, 'bar');\n });\n\n it('coerces a non-error to a string', () => {\n const newErr = addData('Not Found', { foo: 'bar' });\n assert.equal(newErr.message, 'Not Found');\n assert.equal(newErr.data.foo, 'bar');\n });\n});\n\ndescribe('newMessage', () => {\n it('adds a new message to an error', () => {\n const err = new Error('Not Found');\n const newErr = newMessage(err, '404');\n\n assert.equal(err.message, '404: Not Found');\n assert.equal((err as any).data._previousMessages[0], 'Not Found');\n assert.equal(newErr.message, '404: Not Found');\n assert.equal(newErr.data._previousMessages[0], 'Not Found');\n });\n\n it('coerces a non-error to a string', () => {\n const newErr = newMessage('Not Found', '404');\n assert.equal(newErr.message, '404: Not Found');\n assert.equal(newErr.data._previousMessages[0], 'Not Found');\n });\n});\n\ndescribe('augmentError', () => {\n it('adds status, message, and data to an error', () => {\n const err = new Error('Not Found');\n const newErr = augmentError(err, { status: 404, message: 'Missing', data: { foo: 'bar' } });\n\n assert.equal(newErr.message, 'Missing: Not Found');\n assert.equal(newErr.status, 404);\n assert.equal(newErr.data.foo, 'bar');\n assert.equal(newErr.cause, err);\n assert.equal((newErr.cause as any).message, 'Not Found');\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@prairielearn/error",
3
- "version": "1.2.0",
3
+ "version": "2.0.1",
4
+ "type": "module",
4
5
  "main": "./dist/index.js",
5
6
  "repository": {
6
7
  "type": "git",
@@ -10,17 +11,17 @@
10
11
  "scripts": {
11
12
  "build": "tsc",
12
13
  "dev": "tsc --watch --preserveWatchOutput",
13
- "test": "mocha --no-config --require tsx src/*.test.ts"
14
+ "test": "mocha src/**/*.test.ts"
14
15
  },
15
16
  "devDependencies": {
16
- "@prairielearn/html": "^3.1.7",
17
+ "@prairielearn/html": "^4.0.1",
17
18
  "@prairielearn/tsconfig": "^0.0.0",
18
19
  "@types/mocha": "^10.0.6",
19
- "@types/node": "^20.12.2",
20
- "chai": "^4.4.1",
20
+ "@types/node": "^20.12.11",
21
+ "chai": "^5.1.1",
21
22
  "mocha": "^10.4.0",
22
- "tsx": "^4.7.1",
23
- "typescript": "^5.4.3"
23
+ "tsx": "^4.10.2",
24
+ "typescript": "^5.4.5"
24
25
  },
25
26
  "dependencies": {
26
27
  "lodash": "^4.17.21"
package/src/index.test.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { assert } from 'chai';
2
2
 
3
- import { make, makeWithData, addData, newMessage, makeWithInfo, augmentError } from './index';
3
+ import { make, makeWithData, addData, newMessage, makeWithInfo, augmentError } from './index.js';
4
4
 
5
5
  describe('make', () => {
6
6
  it('makes an error without data', () => {
package/src/index.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import _ from 'lodash';
2
+
2
3
  import { HtmlSafeString } from '@prairielearn/html';
3
4
 
4
- export { formatErrorStack, formatErrorStackSafe } from './format';
5
+ export { formatErrorStack, formatErrorStackSafe } from './format.js';
5
6
 
6
7
  interface ErrorWithData extends Error {
7
8
  data: any;
@@ -42,14 +43,14 @@ export function makeWithInfo(message: string, info: string): ErrorWithInfo {
42
43
  }
43
44
 
44
45
  export function addData(err: any, data: any): ErrorWithData {
45
- const newErr: ErrorWithData = _(err).isError() ? err : new Error(String(err));
46
+ const newErr = (_.isError(err) ? err : new Error(String(err))) as ErrorWithData;
46
47
  newErr.data = newErr.data || {};
47
48
  _.assign(newErr.data, data);
48
49
  return newErr;
49
50
  }
50
51
 
51
52
  export function newMessage(err: any, newMsg: string): ErrorWithData {
52
- const newErr: ErrorWithData = _(err).isError() ? err : new Error(String(err));
53
+ const newErr = (_.isError(err) ? err : new Error(String(err))) as ErrorWithData;
53
54
  newErr.data = newErr.data || {};
54
55
  newErr.data._previousMessages = newErr.data._previousMessages || [];
55
56
  newErr.data._previousMessages.splice(0, 0, newErr.message);