fix: provide hints in terminal errors for Node.js globals (#26610)

Add info/hint for terminal errors related to Node.js globals:
- __filename
- __dirname
- Buffer
- global
- setImmediate
- clearImmediate

Closes https://github.com/denoland/deno/issues/17494
This commit is contained in:
Bartek Iwańczuk 2024-10-28 23:55:51 +00:00 committed by GitHub
parent 0e641632c3
commit 484f8ca9c3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 127 additions and 0 deletions

View File

@ -321,6 +321,48 @@ fn get_suggestions_for_terminal_errors(e: &JsError) -> Vec<FixSuggestion> {
]),
FixSuggestion::docs("https://docs.deno.com/go/commonjs"),
];
} else if msg.contains("__filename is not defined") {
return vec![
FixSuggestion::info(cstr!(
"<u>__filename</> global is not available in ES modules."
)),
FixSuggestion::hint(cstr!("Use <u>import.meta.filename</> instead.")),
];
} else if msg.contains("__dirname is not defined") {
return vec![
FixSuggestion::info(cstr!(
"<u>__dirname</> global is not available in ES modules."
)),
FixSuggestion::hint(cstr!("Use <u>import.meta.dirname</> instead.")),
];
} else if msg.contains("Buffer is not defined") {
return vec![
FixSuggestion::info(cstr!(
"<u>Buffer</> is not available in the global scope in Deno."
)),
FixSuggestion::hint(cstr!("Import it explicitly with <u>import { Buffer } from \"node:buffer\";</>.")),
];
} else if msg.contains("clearImmediate is not defined") {
return vec![
FixSuggestion::info(cstr!(
"<u>clearImmediate</> is not available in the global scope in Deno."
)),
FixSuggestion::hint(cstr!("Import it explicitly with <u>import { clearImmediate } from \"node:timers\";</>.")),
];
} else if msg.contains("setImmediate is not defined") {
return vec![
FixSuggestion::info(cstr!(
"<u>setImmediate</> is not available in the global scope in Deno."
)),
FixSuggestion::hint(cstr!("Import it explicitly with <u>import { setImmediate } from \"node:timers\";</>.")),
];
} else if msg.contains("global is not defined") {
return vec![
FixSuggestion::info(cstr!(
"<u>global</> is not available in the global scope in Deno."
)),
FixSuggestion::hint(cstr!("Use <u>globalThis</> instead, or assign <u>globalThis.global = globalThis</>.")),
];
} else if msg.contains("openKv is not a function") {
return vec![
FixSuggestion::info("Deno.openKv() is an unstable API."),

View File

@ -2,3 +2,6 @@ error: Uncaught (in promise) ReferenceError: setImmediate is not defined
const _foo = setImmediate;
^
at [WILDCARD]main.ts:3:14
info: setImmediate is not available in the global scope in Deno.
hint: Import it explicitly with import { setImmediate } from "node:timers";.

View File

@ -0,0 +1,34 @@
{
"tests": {
"__dirname": {
"args": "run dirname.js",
"output": "dirname.out",
"exitCode": 1
},
"__filename": {
"args": "run filename.js",
"output": "filename.out",
"exitCode": 1
},
"clearImmediate": {
"args": "run clear_immediate.js",
"output": "clear_immediate.out",
"exitCode": 1
},
"buffer": {
"args": "run buffer.js",
"output": "buffer.out",
"exitCode": 1
},
"global": {
"args": "run global.js",
"output": "global.out",
"exitCode": 1
},
"setImmediate": {
"args": "run set_immediate.js",
"output": "set_immediate.out",
"exitCode": 1
}
}
}

View File

@ -0,0 +1 @@
Buffer;

View File

@ -0,0 +1,7 @@
error: Uncaught (in promise) ReferenceError: Buffer is not defined
Buffer;
^
at [WILDCARD]buffer.js:1:1
info: Buffer is not available in the global scope in Deno.
hint: Import it explicitly with import { Buffer } from "node:buffer";.

View File

@ -0,0 +1 @@
clearImmediate;

View File

@ -0,0 +1,7 @@
error: Uncaught (in promise) ReferenceError: clearImmediate is not defined
clearImmediate;
^
at [WILDCARD]clear_immediate.js:1:1
info: clearImmediate is not available in the global scope in Deno.
hint: Import it explicitly with import { clearImmediate } from "node:timers";.

View File

@ -0,0 +1 @@
__dirname;

View File

@ -0,0 +1,7 @@
error: Uncaught (in promise) ReferenceError: __dirname is not defined
__dirname;
^
at [WILDCARD]dirname.js:1:1
info: __dirname global is not available in ES modules.
hint: Use import.meta.dirname instead.

View File

@ -0,0 +1 @@
__filename;

View File

@ -0,0 +1,7 @@
error: Uncaught (in promise) ReferenceError: __filename is not defined
__filename;
^
at [WILDCARD]filename.js:1:1
info: __filename global is not available in ES modules.
hint: Use import.meta.filename instead.

View File

@ -0,0 +1 @@
global;

View File

@ -0,0 +1,7 @@
error: Uncaught (in promise) ReferenceError: global is not defined
global;
^
at [WILDCARD]global.js:1:1
info: global is not available in the global scope in Deno.
hint: Use globalThis instead, or assign globalThis.global = globalThis.

View File

@ -0,0 +1 @@
setImmediate;

View File

@ -0,0 +1,7 @@
error: Uncaught (in promise) ReferenceError: setImmediate is not defined
setImmediate;
^
at [WILDCARD]set_immediate.js:1:1
info: setImmediate is not available in the global scope in Deno.
hint: Import it explicitly with import { setImmediate } from "node:timers";.