mirror of
https://github.com/denoland/deno.git
synced 2024-11-25 15:29:32 -05:00
fix: stack traces for modules imported via std/node's require (#4035)
This commit is contained in:
parent
74c37e759a
commit
8c1c929034
5 changed files with 28 additions and 6 deletions
|
@ -93,8 +93,10 @@ declare global {
|
|||
|
||||
shared: SharedArrayBuffer;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
evalContext(code: string): [any, EvalErrorInfo | null];
|
||||
evalContext(
|
||||
code: string,
|
||||
scriptName?: string
|
||||
): [unknown, EvalErrorInfo | null];
|
||||
|
||||
formatError: (e: Error) => string;
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ use v8::MapFnTo;
|
|||
|
||||
use std::convert::TryFrom;
|
||||
use std::option::Option;
|
||||
use url::Url;
|
||||
|
||||
lazy_static! {
|
||||
pub static ref EXTERNAL_REFERENCES: v8::ExternalReferences =
|
||||
|
@ -448,6 +449,9 @@ fn eval_context(
|
|||
}
|
||||
};
|
||||
|
||||
let url = v8::Local::<v8::String>::try_from(args.get(1))
|
||||
.map(|n| Url::from_file_path(n.to_rust_string_lossy(scope)).unwrap());
|
||||
|
||||
let output = v8::Array::new(scope, 2);
|
||||
/*
|
||||
output[0] = result
|
||||
|
@ -460,7 +464,9 @@ fn eval_context(
|
|||
*/
|
||||
let mut try_catch = v8::TryCatch::new(scope);
|
||||
let tc = try_catch.enter();
|
||||
let name = v8::String::new(scope, "<unknown>").unwrap();
|
||||
let name =
|
||||
v8::String::new(scope, url.as_ref().map_or("<unknown>", Url::as_str))
|
||||
.unwrap();
|
||||
let origin = script_origin(scope, name);
|
||||
let maybe_script = v8::Script::compile(scope, context, source, Some(&origin));
|
||||
|
||||
|
|
|
@ -1045,11 +1045,11 @@ type RequireWrapper = (
|
|||
__dirname: string
|
||||
) => void;
|
||||
|
||||
function wrapSafe(filename_: string, content: string): RequireWrapper {
|
||||
function wrapSafe(filename: string, content: string): RequireWrapper {
|
||||
// TODO: fix this
|
||||
const wrapper = Module.wrap(content);
|
||||
// @ts-ignore
|
||||
const [f, err] = Deno.core.evalContext(wrapper);
|
||||
const [f, err] = Deno.core.evalContext(wrapper, filename);
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
const { test } = Deno;
|
||||
import { assertEquals, assert } from "../testing/asserts.ts";
|
||||
import { assertEquals, assert, assertStrContains } from "../testing/asserts.ts";
|
||||
import { createRequire } from "./module.ts";
|
||||
|
||||
// TS compiler would try to resolve if function named "require"
|
||||
|
@ -48,3 +48,12 @@ test(function requireNodeOs() {
|
|||
assert(os.arch);
|
||||
assert(typeof os.arch() == "string");
|
||||
});
|
||||
|
||||
test(function requireStack() {
|
||||
const { hello } = require_("./tests/cjs/cjs_throw");
|
||||
try {
|
||||
hello();
|
||||
} catch (e) {
|
||||
assertStrContains(e.stack, "/tests/cjs/cjs_throw.js");
|
||||
}
|
||||
});
|
||||
|
|
5
std/node/tests/cjs/cjs_throw.js
Normal file
5
std/node/tests/cjs/cjs_throw.js
Normal file
|
@ -0,0 +1,5 @@
|
|||
function hello() {
|
||||
throw new Error("bye");
|
||||
}
|
||||
|
||||
module.exports = { hello };
|
Loading…
Reference in a new issue