@prairielearn/error 2.0.4 → 2.0.6
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/CHANGELOG.md +12 -0
- package/dist/format.js +1 -1
- package/dist/format.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
- package/src/format.ts +1 -1
- package/src/index.ts +1 -1
package/CHANGELOG.md
CHANGED
package/dist/format.js
CHANGED
package/dist/format.js.map
CHANGED
|
@@ -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,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,
|
|
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,MAAM,CAAC;QACP,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 {\n return err.stack;\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
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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","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
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\n\nimport { type 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/error",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"repository": {
|
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
"test": "c8 mocha src/**/*.test.ts"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@prairielearn/html": "^4.0.
|
|
17
|
+
"@prairielearn/html": "^4.0.6",
|
|
18
18
|
"@prairielearn/tsconfig": "^0.0.0",
|
|
19
|
-
"@types/mocha": "^10.0.
|
|
20
|
-
"@types/node": "^20.
|
|
19
|
+
"@types/mocha": "^10.0.9",
|
|
20
|
+
"@types/node": "^20.17.5",
|
|
21
21
|
"c8": "^10.1.2",
|
|
22
|
-
"chai": "^5.1.
|
|
23
|
-
"mocha": "^10.
|
|
24
|
-
"tsx": "^4.
|
|
25
|
-
"typescript": "^5.
|
|
22
|
+
"chai": "^5.1.2",
|
|
23
|
+
"mocha": "^10.8.2",
|
|
24
|
+
"tsx": "^4.19.2",
|
|
25
|
+
"typescript": "^5.6.3"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"lodash": "^4.17.21"
|
package/src/format.ts
CHANGED