summaryrefslogtreecommitdiff
path: root/cli/js/ops/errors.ts
diff options
context:
space:
mode:
Diffstat (limited to 'cli/js/ops/errors.ts')
-rw-r--r--cli/js/ops/errors.ts61
1 files changed, 61 insertions, 0 deletions
diff --git a/cli/js/ops/errors.ts b/cli/js/ops/errors.ts
new file mode 100644
index 000000000..f96e376d6
--- /dev/null
+++ b/cli/js/ops/errors.ts
@@ -0,0 +1,61 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+import { DiagnosticItem } from "../diagnostics.ts";
+import { sendSync } from "./dispatch_json.ts";
+
+/**
+ * Format an array of diagnostic items and return them as a single string.
+ * @param items An array of diagnostic items to format
+ */
+export function formatDiagnostics(items: DiagnosticItem[]): string {
+ return sendSync("op_format_diagnostic", { items });
+}
+
+export interface Location {
+ /** The full url for the module, e.g. `file://some/file.ts` or
+ * `https://some/file.ts`. */
+ filename: string;
+
+ /** The line number in the file. It is assumed to be 1-indexed. */
+ line: number;
+
+ /** The column number in the file. It is assumed to be 1-indexed. */
+ column: number;
+}
+
+/** Given a current location in a module, lookup the source location and
+ * return it.
+ *
+ * When Deno transpiles code, it keep source maps of the transpiled code. This
+ * function can be used to lookup the original location. This is automatically
+ * done when accessing the `.stack` of an error, or when an uncaught error is
+ * logged. This function can be used to perform the lookup for creating better
+ * error handling.
+ *
+ * **Note:** `line` and `column` are 1 indexed, which matches display
+ * expectations, but is not typical of most index numbers in Deno.
+ *
+ * An example:
+ *
+ * const orig = Deno.applySourceMap({
+ * location: "file://my/module.ts",
+ * line: 5,
+ * column: 15
+ * });
+ * console.log(`${orig.filename}:${orig.line}:${orig.column}`);
+ *
+ */
+export function applySourceMap(location: Location): Location {
+ const { filename, line, column } = location;
+ // On this side, line/column are 1 based, but in the source maps, they are
+ // 0 based, so we have to convert back and forth
+ const res = sendSync("op_apply_source_map", {
+ filename,
+ line: line - 1,
+ column: column - 1
+ });
+ return {
+ filename: res.filename,
+ line: res.line + 1,
+ column: res.column + 1
+ };
+}