1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-28 01:59:06 -05:00

fix: stack traces for modules imported via std/node's require (#4035)

This commit is contained in:
Nikolai Vavilov 2020-03-19 16:42:07 +02:00 committed by GitHub
parent 74c37e759a
commit 8c1c929034
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 6 deletions

View file

@ -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;

View file

@ -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));

View file

@ -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;
}

View file

@ -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");
}
});

View file

@ -0,0 +1,5 @@
function hello() {
throw new Error("bye");
}
module.exports = { hello };